2012-08-07 39 views
0

我得到了一个有效的复杂json,我需要解析这个json并从Java中的这个复杂的json中打印出只有ak,dt和mi的值...希望你能帮助我...从java中的复杂JSON中提取特定值

{ 
    "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" 
    } 
} 
+0

你可以使用任何JSON解析器像GSON等要做到这一点 – 2012-08-07 10:43:28

+0

你可以使用JSON API http://code.google.com/p/google-gson/ – 2012-08-07 10:44:55

回答

1

像其他人所说有许多库,在那里,你可以使用(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美分。

2

使用json-path

这就像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... 
+0

谢谢,我已经得到了一些想法... – labbyfrost 2012-08-07 11:18:11

2

您可以使用JsonPath来提取值。我建议JsonSurfer库。

<dependency> 
    <groupId>com.github.jsurfer</groupId> 
    <artifactId>jsurfer-simple</artifactId> 
    <version>1.2.1</version> 
</dependency> 

示例代码通过两个步骤解决您的问题:

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

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

JsonSurfer jsonSurfer = JsonSurfer.simple(); 
String cp = jsonSurfer.collectOne(new StringReader(yourString), String.class, "$.CP"); 
Collection<Object> result = jsonSurfer.collectAll(new StringReader(cp), "$..ak", "$..dt", "$..mi");