如何在Java中操纵HTTP json响应数据

时间:2014-11-29 10:24:53

标签: java json http httpresponse

HttpGet getRequest=new HttpGet("/rest/auth/1/session/");
getRequest.setHeaders(headers);
httpResponse = httpclient.execute(target,getRequest);

entity = httpResponse.getEntity();

System.out.println(EntityUtils.toString(entity));

以json格式输出如下

----------------------------------------
{"session":{"name":"JSESSIONID","value":"5F736EF0A08ACFD7020E482B89910589"},"loginInfo":{"loginCount":50,"previousLoginTime":"2014-11-29T14:54:10.424+0530"}}
----------------------------------------

我想知道的是如何使用 Java 操作此数据而不将其写入文件? 我想在我的代码中打印名称,值

杰克逊图书馆是首选,但任何人都可以。

提前致谢

3 个答案:

答案 0 :(得分:2)

如果没有图书馆,可以采用以下两种方法。

新(更好)答案:

findInLine可能会更好。 (scannerName.findInLine(pattern);

可能是这样的:

s.findInLine("{"session":{"name":"(\\w+)","value":"(\\w+)"},"loginInfo":{"loginCount":(\\d+),"previousLoginTime":"(\\w+)"}}");

w匹配单词字符(字母,数字和下划线),d匹配数字,+使它匹配多次(因此它只在一个字符后不会停止)。

在此处了解模式https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

老人回答:

我很确定你可以在这里使用带有自定义分隔符的扫描仪。

Scanner s = new Scanner(input).useDelimiter("\"");

应该返回类似的内容:

{
session
:{
name
:
JSESSIONID
,
value
:
5F736EF0A08ACFD7020E482B89910589

等等。然后只需对该列表进行排序/使用更智能的分隔符/删除不必要的位。 摆脱所有其他项目是一个相当不错的开始。

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html有关于此的信息。

答案 1 :(得分:2)

您可以使用this JSON库将您的json字符串解析为JSONObject,并从该对象读取值,如下所示:

JSONObject json = new JSONObject(EntityUtils.toString(entity));
JSONObject sessionObj =  json.getJSONObject("session");
System.out.println(sessionObj.getString("name"));

您需要从您想要读取值的位置读取该对象。在这里,您需要name对象中session参数的值,因此您首先使用getJSONObject(KeyString)session的值作为JSONObject获取并阅读name使用函数getString(KeyString)从该对象获取的值如上所示。

愿这对你有所帮助。

答案 2 :(得分:2)

我非常推荐建立在apache http api上的http-request

private static final HttpRequest<Map<String, Map<String, String>>> HTTP_REQUEST = HttpRequestBuilder.createGet(yourUri, new TypeReference<Map<String, Map<String, String>>>{})
    .addDefaultHeaders(headers)
    .build();

public void send(){
   ResponseHandler<Map<String, Map<String, String>>> responseHandler = HTTP_REQUEST.execute();
   Map<String, Map<String, String>> data = responseHandler.get();
}

如果您想使用jackson,您可以:

entity = httpResponse.getEntity();
ObjectMapper mapper = new ObjectMapper();
Map<String, Map<String, String>> data = mapper.readValue(entity.getContent(),  new TypeReference<Map<String, Map<String, String>>>{});