繁体   English   中英

如何在java中将特定的Json元素检索到数组中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM