简体   繁体   English

REST api和json解析

[英]REST api and json parsing

I'm writing code in Java for REST and the output which I'm getting is in JSON format. 我正在用Java编写REST代码,而我得到的输出是JSON格式。 I want to parse the JSON string into a simple string in Java but I'm getting errors. 我想在Java中将JSON字符串解析成一个简单的字符串,但是我遇到了错误。 Below is my code: 以下是我的代码:

package restapp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import java.util.*;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.json.JSONArray;
import org.json.JSONException;

import java.util.Iterator;
import org.json.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;





public class testapp {

    public static void main(String[] args) throws JSONException, ParseException {
        String output = "abc";
        try {

            URL url = new URL("http://ip/sss-wsrcrest-controller-5.2.3.1/wsrcservice/wsrc/v1/processGet?subSystemId=external&subSystemPassword=password&operation=listSubscriptions&MSISDN=1111");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");

            if (conn.getResponseCode() != 200) {

                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));

            //String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }

            conn.disconnect();

        } catch (MalformedURLException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();
        }

        JSONParser parser = new JSONParser();
        //System.out.println(str);
        org.json.simple.JSONObject jsonObject = (org.json.simple.JSONObject) parser.parse(str);


        try {


            org.json.simple.JSONArray msg = (org.json.simple.JSONArray) jsonObject.get("keyParamArray");
            int n = (msg).length();
            for (int i = 0; i < n; ++i) {
                JSONObject person = (msg).getJSONObject(i);
                System.out.println(person.getInt("key"));
            }


        } 

        catch (Exception e) {
            e.printStackTrace();
        }



    } 

}         

the output is 输出是

{
    "errorCode": "0",
    "errorMessage": "processed successfully",
    "keyParamArray": {
        "KeyParam": [
            {
                "key": "MSISDN",
                "value": "123"
            },
            {
                "key": "SUBSCRIBERID",
                "value": "123"
            },
            {
                "key": "CUSTOMNUMFIELD9",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD10",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD6",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD5",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD8",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD7",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD2",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD1",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD4",
                "value": "0"
            },
            {
                "key": "CUSTOMNUMFIELD3",
                "value": "0"
            },
            {
                "key": "PARENTSUBSCRIBERID",
                "value": "0"
            },
            {
                "key": "ACTIVE",
                "value": "1"
            },
            {
                "key": "BARRINGSTATUS",
                "value": "1"
            }
        ]
    }
}

So I want output as 所以我想输出为

MSISDN 123
 SUBSCRIBERID 123

... and so on ... 等等

As far as i understand, youre getting json, but want to turn it into your own format. 据我所知,你得到了json,但想把它变成你自己的格式。 The you should consider using a json library like org.json. 您应该考虑使用像org.json这样的json库。

Turning the string into a JSONObject is as easy as: 将字符串转换为JSONObject非常简单:

JSONObject obj = new JSONObject(output);

Maven dependency : Maven依赖:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20141113</version>
</dependency>

I would also suggest to use something like http://unirest.io/java.html for the http request, follow the link, its really easy. 我还建议使用像http://unirest.io/java.html这样的http请求,按照链接,它真的很容易。

org.json.simple.JSONObject jsonObject = (org.json.simple.JSONObject) parser.parse(str); 

在代码的上面一行中,你已经将str传递给了parser.parse(str)但它在你的类中没有定义。

You can do it in webservice. 你可以在webservice中做到这一点。 Webservice must return result this. Webservice必须返回结果。

MSISDN 123 SUBSCRIBERID 123 MSISDN 123 SUBSCRIBERID 123

Or you can parse json and get what you want. 或者你可以解析json并获得你想要的东西。 for example easy parser 例如简单的解析器

 List<POJO> result = new ArrayList<>();
    url = new URL();
    InputStream is = url.openStream(url);
    JsonParser parser = Json.createParser(is);

    while (parser.hasNext()) {
        Event e = parser.next();
        if (e == Event.KEY_NAME) {
            switch (parser.getString()) {

                 case "KEY":
                    parser.next();
                    b.setKEY_MSISDN(parser.getString());
                    result.add(b);
                    break;
                 case "KEY":
                    parser.next();
                    b.setKEY_SUBSCRIBERID(parser.getString());
                    result.add(b);
                    b = new POJO();
                    break;

                default:
            }
        }
    }
    return result;

You can try with something similar to this: 你可以尝试类似的东西:

public class MyMessage {
    private int errorCode;
    private String errorMessage;
    private KeyParamArray myParams;
    /*
    add getters and setters
    */
}

public class KeyParam {
    private Entry[] entries;
    /*
    add getter and setter
    */
}

public class Entry {
    private String key;
    private String value;
    /*
    add getters and setters
    */
}

@Path("rest")
public class RestServices {

    @POST
    @Consumes("application/json")
    public Response saveMyMessage(MyMessage message) {
        // do what you want with the message
        return Response.ok();
    }
}

And you can use Jersey for rest services and Jackson as the Json parser. 你可以使用Jersey作为休息服务,使用Jackson作为Json解析器。 Maven dependencies are the following : Maven依赖项如下:

            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-core</artifactId>
                <version>1.9.1</version>
            </dependency>
            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-server</artifactId>
                <version>1.9.1</version>
            </dependency>
            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-bundle</artifactId>
                <version>1.9.1</version>
            </dependency>
            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-json</artifactId>
                <version>1.9.1</version>
            </dependency>

            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-jaxrs</artifactId>
                <version>1.8.3</version>
                <scope>provided</scope>
            </dependency>

(You could use newer versions of the libraries, these are just the one I use in a project I'm working on). (您可以使用更新版本的库,这些只是我在我正在处理的项目中使用的版本)。

String jsonString = "{\"keyParamArray\":{\"KeyParam\":[{\"key\":\"MSISDN\",\"value\":\"123\"},{\"key\":\"SUBSCRIBERID\",\"value\":\"123\"},{\"key\":\"CUSTOMNUMFIELD9\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD10\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD6\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD5\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD8\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD7\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD2\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD1\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD4\",\"value\":\"0\"},{\"key\":\"CUSTOMNUMFIELD3\",\"value\":\"0\"},{\"key\":\"PARENTSUBSCRIBERID\",\"value\":\"0\"},{\"key\":\"ACTIVE\",\"value\":\"1\"},{\"key\":\"BARRINGSTATUS\",\"value\":\"1\"}]}}";
    org.codehaus.jettison.json.JSONObject json;
    try {
        json = new org.codehaus.jettison.json.JSONObject(jsonString.toString());

    org.codehaus.jettison.json.JSONObject responseData = json.getJSONObject("keyParamArray");
    final JSONArray geodata = responseData.getJSONArray("KeyParam");
    final int n = geodata.length();
    for (int i = 0; i < n; ++i) {
      final org.codehaus.jettison.json.JSONObject person = geodata.getJSONObject(i);

     System.out.println(person.getString("key"));
    }
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

This solution is in java Script by using parsing from xml to JSON and work fine for me. 这个解决方案在java Script中使用从xml到JSON的解析,并且对我来说很好。

 var resultjson = JSON.stringify(result, null, 2);
 var js = JSON.parse(resultjson);
 var msisdnvar = js.abcReturn.keyParam.keyParam[0].key.$value;
 var msisdnval = js.abcReturn.keyParam.keyParam[0].value.$value;
 var subscribervar = js.abcReturn.keyParam.keyParam[1].key.$value;
 var subscriberval = js.abcReturn.keyParam.keyParam[1].value.$value;
 console.log(msisdnvar+': '+msisdnval+', '+subscribervar+': '+subscriberval);

Will give output as; 将输出作为;

MSISDN: 123, SUBSCRIBERID: 123 MSISDN:123,SUBSCRIBERID:123

Note: Please change abcReturn with your API-Name like "API-NameReturn" 注意:请使用您的API名称更改abcReturn,例如“API-NameReturn”


Enjoy :) 请享用 :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM