Java REST api 和 json 解析

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30117737/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 09:10:06  来源:igfitidea点击:

REST api and json parsing

javajsonrestnullpointerexception

提问by USER

I'm writing code in Java for REST and the output which I'm getting is in JSON format. I want to parse the JSON string into a simple string in Java but I'm getting errors. Below is my code:

我正在用 Java 编写用于 REST 的代码,我得到的输出是 JSON 格式。我想用 Java 将 JSON 字符串解析为一个简单的字符串,但出现错误。下面是我的代码:

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

... 等等

回答by Farid Valiyev

You can do it in webservice. Webservice must return result this.

你可以在网络服务中做到这一点。Webservice 必须返回结果 this。

MSISDN 123 SUBSCRIBERID 123

MSISDN 123 订阅者ID 123

Or you can parse json and get what you want. for example easy parser

或者你可以解析 json 并得到你想要的。例如简单的解析器

 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;

回答by orbatschow

As far as i understand, youre getting json, but want to turn it into your own format. The you should consider using a json library like org.json.

据我了解,您正在获取 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.htmlfor the http request, follow the link, its really easy.

我还建议对http 请求使用类似http://unirest.io/java.html 的东西,点击链接,它真的很容易。

回答by Alok Mishra

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

in above line of your code, you have passed strto parser.parse(str)but it's defined nowhere in your class .

在上面的代码行中,您已传递strparser.parse(str)但它在您的类中没有定义。

回答by francesco foresti

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 Hymanson as the Json parser. Maven dependencies are the following :

您可以将 Jersey 用于休息服务,并将 Hymanson 用作 Json 解析器。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.Hymanson</groupId>
                <artifactId>Hymanson-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).

(您可以使用较新版本的库,这些只是我在我正在处理的项目中使用的库)。

回答by priyanka hj

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();
    }
    }

回答by Imran Hafeez

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,订阅者ID:123

Note: Please change abcReturn with your API-Name like "API-NameReturn"


Enjoy :)

注意:请使用您的 API 名称更改 abcReturn,例如“API-NameReturn”


享受 :)