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
REST api and json parsing
提问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 str
to parser.parse(str)
but it's defined nowhere in your class .
在上面的代码行中,您已传递str
到parser.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”
享受 :)