[英]How to retrieve specific Json Elements into an array in java
我从 Elasticsearch 返回了以下 json。 在 Java 中将highlight.name
值检索到List<String>
的最快和最有效的方法是什么?
{
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"max_score": 6.512624,
"hits": [
{
"_index": "shops",
"_type": "shop",
"_id": "AVfRy7_-rRRgqtjX0fQt",
"_score": 6.512624,
"highlight": {
"name": [
" <em>Smartwatch</em> Phone"
]
}
},
{
"_index": "shops",
"_type": "shop",
"_id": "AVfRy7_9rRRgqtjX0fGz",
"_score": 6.446859,
"highlight": {
"name": [
" <em>Smartwatch</em>"
]
}
},
{
"_index": "shops",
"_type": "shop",
"_id": "AVfRy7_-rRRgqtjX0fVa",
"_score": 3.7999475,
"highlight": {
"name": [
" 3G <em>Smartphone</em>"
]
}
}
]
}
}
为此使用 JSONObject:
// jsonResult is a string that contains your ES response
JSONArray json = (new JSONObject(jsonResult)).getJSONObject("hits").getJSONArray("hits");
List<JSONArray> result = new ArrayList<>();
json.forEach((j) -> {
JSONObject highlight = ((JSONObject) j).getJSONObject("highlight");
result.add(highlight.getJSONArray("name"));
});
// Outputs [[" <em>Smartwatch<\/em> Phone"], [" <em>Smartwatch<\/em>"], [" 3G <em>Smartphone<\/em>"]]
System.out.println(result);
Jackson 库提供 json 简单格式。
ObjectMapper om = new ObjectMapper();
om.enable(SerializationConfig.Feature.INDENT_OUTPUT);
Object json = om.readValue( output, Object.class );
System.out.println( objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(json));
您将必须对替代方案进行基准测试,以查看哪个对您的用例更快、更“有效”(无论这意味着什么)。 以下可能比通过 Jackson 更快,但考虑到使用正则表达式更脆弱。
List<String> matches = new ArrayList<>();
Pattern p = Pattern.compile("\"highlight\".*?\"name\": \\[\\s*\"(.*?)\"\\s*\\]", Pattern.DOTALL);
Matcher m = p.matcher(json);
while (m.find()) {
matches.add(m.group(1));
}
System.err.println(matches);
您可以使用jsonPath库,这是仅在一行代码中从 json 读取值的最快方法。
List<String> highlightResults = JsonPath.parse(/*yourJsonString*/).read("$..name", List.class);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.