在java中从复杂的JSON中提取特定值

在java中从复杂的JSON中提取特定值,java,json,Java,Json,我得到了一个有效的复杂json,我需要解析这个json,并在java中只打印这个复杂json中的ak、dt和mi值。。。希望你能帮助我 { "CP": "{\"e\":{\"h\":{\"ak\":\"1c8d1d7eaa32ff3f58a882\",\"at\":\"app\"},\"c\":{\"dt\":\"MEmulator\",\"mi\":\"DD278047D56BF292F1FC16F\",\"ui\":\"m4J\/2s=\",\"av\":\"0.2\",\"pn\":\

我得到了一个有效的复杂json,我需要解析这个json,并在java中只打印这个复杂json中的ak、dt和mi值。。。希望你能帮助我

{
  "CP": "{\"e\":{\"h\":{\"ak\":\"1c8d1d7eaa32ff3f58a882\",\"at\":\"app\"},\"c\":{\"dt\":\"MEmulator\",\"mi\":\"DD278047D56BF292F1FC16F\",\"ui\":\"m4J\/2s=\",\"av\":\"0.2\",\"pn\":\"WP\",\"pv\":\"7.10\",\"nv\":\"C# 1.1.0\",\"al\":\"en\"},\"b\":[{\"ts\":139658547,\"tz\":-400,\"s\":\"StartUpScreen\",\"et\":8,\"ev\":\"sessionStart\",\"si\":\"19477682-de55-414f-82c9-19bec331dc33\",\"tt\":{\"DaySessionStarted\":\"Tuesday\"}},{\"ts\":1319549658751,\"tz\":-400,\"s\":\"StartUpScreen\",\"et\":3,\"ev\":\"AutomaticFeedRefresh\",\"si\":\"19477682-de5ec331dc33\",\"tt\":{}},{\"ts\":1319549675609,\"tz\":-400,\"s\":\"MainScreen\",\"et\":3,\"ev\":\"MainScreen Event\",\"si\":\"19477682-de55-414f-82c9-19bec331dc33\",\"tt\":{}},{\"ts\":1319549677179,\"tz\":-400,\"s\":\"MainScreen\",\"et\":3,\"ev\":\"MainScreen Event\",\"si\":\"19477682-de55-414f-82c9-19bec331dc33\",\"tt\":{}},{\"ts\":1319549678401,\"tz\":-400,\"s\":\"MainScreen\",\"et\":3,\"ev\":\"MainScreen Event\",\"si\":\"19477682-de55-414f-82c9-19bec331dc33\",\"tt\":{}},{\"ts\":1319549679973,\"tz\":-400,\"s\":\"MainScreen\",\"et\":3,\"ev\":\"MainScreen Event\",\"si\":\"19477682-c9-19bec331dc33\",\"tt\":{}}],\"tt\":{\"OSV\":\"ME\"}}}",
  "SP": {
    "httpHeaders": {
      "x-bluecoat-via": [
        "35D3468F4D5F18"
      ],
      "content-type": [
        "application\/x-form-ur"
      ],
      "connection": [
        "Keep-Alive"
      ],
      "host": [
        "20.198.134.198:8080"
      ],
      "accept": [
        "text\/html, image\/gif, image\/jpeg, *; q=.2, *\/*; q=.2"
      ],
      "content-length": [
        "1791"
      ],
      "user-agent": [
        "Java\/1.6.0_23"
      ]
    },
    "senderIp": [
      "112.101.216.113"
    ],
    "receiveTimeStamp": "2012-06-26T06:29:36+0000"
  }
}
使用

它类似于JSON的xpath,允许您在JSON对象上编写字符串查询。 项目站点上有很多示例显示了可能的用法,但在您的例子中,它可能只是一个简单的点符号

提供的JSON示例如下:

// First extract the CP value, as its JSON-string-inside-JSON:
String cp = JsonPath.read(yourJsonString, "$.CP");

// Treat the `cp` as another JSON-string, and extract the ak value:
String ak = JsonPath.read(cp, "$.e.h.ak");

// Do the rest yourself...
使用

它类似于JSON的xpath,允许您在JSON对象上编写字符串查询。 项目站点上有很多示例显示了可能的用法,但在您的例子中,它可能只是一个简单的点符号

提供的JSON示例如下:

// First extract the CP value, as its JSON-string-inside-JSON:
String cp = JsonPath.read(yourJsonString, "$.CP");

// Treat the `cp` as another JSON-string, and extract the ak value:
String ak = JsonPath.read(cp, "$.e.h.ak");

// Do the rest yourself...

正如其他人所建议的那样,有许多LIB可以使用(npe建议似乎非常好)。另一方面,如果您只有这些简单的案例,并且不需要使用JSON做任何其他事情,那么您可能只需要一个正则表达式。本质上,JSON只是文本,所以您可以这样做:

    Pattern akPattern = Pattern.compile("ak\":\"([^\"]+)");
    Matcher matcher = akPattern.matcher(jsonAsString);

    matcher.find();
    String akValue = matcher.group(1);

    System.out.println(akValue);
这将打印出“ak”的值

但同样,只有在没有任何其他JSON需求的情况下,我才会这样做。否则,使用JSON库


我的2美分。

像其他人建议的那样,有很多LIB可以使用(npe建议似乎非常好)。另一方面,如果您只有这些简单的案例,并且不需要使用JSON做任何其他事情,那么您可能只需要一个正则表达式。本质上,JSON只是文本,所以您可以这样做:

    Pattern akPattern = Pattern.compile("ak\":\"([^\"]+)");
    Matcher matcher = akPattern.matcher(jsonAsString);

    matcher.find();
    String akValue = matcher.group(1);

    System.out.println(akValue);
这将打印出“ak”的值

但同样,只有在没有任何其他JSON需求的情况下,我才会这样做。否则,使用JSON库


我的2美分。

您可以使用JsonPath提取值。我推荐图书馆


com.github.jsurfer
jsurfer简单
1.2.1
示例代码分两步解决您的问题:

1) 从“$.CP”节点提取普通字符串

2) 解析“CP”字符串并提取“ak”、“dt”和“mi”的值

JsonSurfer-JsonSurfer=JsonSurfer.simple();
String cp=jsonSurfer.collectOne(新的StringReader(您的字符串),String.class,“$.cp”);
收集结果=jsonSurfer.collectAll(新的StringReader(cp),“$…ak”,“$…dt”,“$…mi”);

您可以使用JsonPath提取值。我推荐图书馆


com.github.jsurfer
jsurfer简单
1.2.1
示例代码分两步解决您的问题:

1) 从“$.CP”节点提取普通字符串

2) 解析“CP”字符串并提取“ak”、“dt”和“mi”的值

JsonSurfer-JsonSurfer=JsonSurfer.simple();
String cp=jsonSurfer.collectOne(新的StringReader(您的字符串),String.class,“$.cp”);
收集结果=jsonSurfer.collectAll(新的StringReader(cp),“$…ak”,“$…dt”,“$…mi”);

您可以使用任何JSON解析器(如Gson等)执行此操作您可以使用JSON API您可以使用任何JSON解析器(如Gson等)执行此操作您可以使用JSON API