akr*_*roy 18 java json jsonpath
我将JSON作为字符串,将JSONPath作为字符串.我想用JSON路径查询JSON,将生成的JSON作为字符串.
我认为Jayway的json路径 是标准.在网上API,但是,并没有什么太大关系到你的Maven得到实际库.GrepCode的版本大致匹配.
看起来我应该能做到:
String originalJson; //these are initialized to actual data
String jsonPath;
String queriedJson = JsonPath.<String>read(originalJson, jsonPath);
Run Code Online (Sandbox Code Playgroud)
问题是,read基于什么JSONPath真正发现任何感觉最合适的回报(如List<Object>,String,double,等),因此我的代码会因某些查询的除外.假设有一些方法可以查询JSON并获取JSON,这似乎是合理的.有什么建议?
Ank*_*ary 11
肯定存在一种方法来查询Json并使用JsonPath返回Json.见下面的例子:
String jsonString = "{\"delivery_codes\": [{\"postal_code\": {\"district\": \"Ghaziabad\", \"pin\": 201001, \"pre_paid\": \"Y\", \"cash\": \"Y\", \"pickup\": \"Y\", \"repl\": \"N\", \"cod\": \"Y\", \"is_oda\": \"N\", \"sort_code\": \"GB\", \"state_code\": \"UP\"}}]}";
String jsonExp = "$.delivery_codes";
JsonNode pincodes = JsonPath.read(jsonExp, jsonString, JsonNode.class);
System.out.println("pincodesJson : "+pincodes);
Run Code Online (Sandbox Code Playgroud)
上面的输出将是内部Json.
[{ "POSTAL_CODE":{ "区": "加济阿巴德", "针":201001, "pre_paid": "Y", "现金": "Y", "皮卡": "Y", "REPL":" N", "鳕鱼": "Y", "is_oda": "N", "sort_code": "GB", "STATE_CODE": "UP"}}]
现在可以通过迭代我们上面得到的List(JsonNode)来解析每个单独的名称/值对.
for(int i = 0; i< pincodes.size();i++){
JsonNode node = pincodes.get(i);
String pin = JsonPath.read("$.postal_code.pin", node, String.class);
String district = JsonPath.read("$.postal_code.district", node, String.class);
System.out.println("pin :: " + pin + " district :: " + district );
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
pin :: 201001 district ::加济阿巴德
根据您尝试解析的Json,您可以决定是获取List还是仅获取单个String/Long值.
希望它有助于解决您的问题.
对于那些想知道为什么这些多年以前的答案不起作用的人,您可以从测试用例中学到很多东西。
截至 2018 年 9 月,以下是获取 Jackson JsonNode 结果的方法:
Configuration jacksonConfig = Configuration.builder()
.mappingProvider( new JacksonMappingProvider() )
.jsonProvider( new JacksonJsonProvider() )
.build();
JsonNode node = JsonPath.using( jacksonConfig ).parse(jsonString);
Run Code Online (Sandbox Code Playgroud)
自上述所有答案/评论以来,在jayway JsonPath上发现的Java JsonPath API 可能已经发生了一些变化.文档也是.只需按照上面的链接阅读README.md,它包含一些非常明确的使用文档IMO.
基本上,从图书馆的当前最新版本2.2.0开始,有几种不同的方法可以实现此处的要求,例如:
Pattern:
--------
String json = "{...your JSON here...}";
String jsonPathExpression = "$...your jsonPath expression here...";
J requestedClass = JsonPath.parse(json).read(jsonPathExpression, YouRequestedClass.class);
Example:
--------
// For better readability: {"store": { "books": [ {"author": "Stephen King", "title": "IT"}, {"author": "Agatha Christie", "title": "The ABC Murders"} ] } }
String json = "{\"store\": { \"books\": [ {\"author\": \"Stephen King\", \"title\": \"IT\"}, {\"author\": \"Agatha Christie\", \"title\": \"The ABC Murders\"} ] } }";
String jsonPathExpression = "$.store.books[?(@.title=='IT')]";
JsonNode jsonNode = JsonPath.parse(json).read(jsonPathExpression, JsonNode.class);
Run Code Online (Sandbox Code Playgroud)
和作为参考,调用"JsonPath.parse(..)"将返回类"的一个目的JsonContent "实现一些接口,诸如" ReadContext ",它包含几个不同的"读(..)的操作中,如一个表明以上:
/**
* Reads the given path from this context
*
* @param path path to apply
* @param type expected return type (will try to map)
* @param <T>
* @return result
*/
<T> T read(JsonPath path, Class<T> type);
Run Code Online (Sandbox Code Playgroud)
希望这有助于任何人.