【问题标题】:Getting the values of a specific key from JsonNode从 JsonNode 获取特定键的值
【发布时间】:2022-08-07 15:00:39
【问题描述】:

我有一个 JsonNode 结果表示为:

[
  {
    \"item\": {
      \"type\": \"uri\",
      \"value\": \"http://www.wikidata.org/entity/Q42442324\"
    },
    \"prop\": {
      \"type\": \"uri\",
      \"value\": \"http://www.wikidata.org/prop/direct/P21\"
    },
    \"itemLabel\": {
      \"xml:lang\": \"en\",
      \"type\": \"literal\",
      \"value\": \"Kiisu Miisu\"
    }
  },
  {
    \"item\": {
      \"type\": \"uri\",
      \"value\": \"http://www.wikidata.org/entity/Q43260736\"
    },
    \"prop\": {
      \"type\": \"uri\",
      \"value\": \"http://www.wikidata.org/prop/direct/P21\"
    },
    \"itemLabel\": {
      \"xml:lang\": \"en\",
      \"type\": \"literal\",
      \"value\": \"Paddles\"
    }
  }
]

我正在尝试使用以下代码将键 \"value\" 的值检索到数组列表中,但出现错误无法调用 \"com.fasterxml.jackson.databind.JsonNode.findValue(String)\" 因为 \"com.fasterxml.jackson.databind.JsonNode.get(int)\" 的返回值为 null

for (int i = 0; i < resultSize; i++) {
    JsonNode jsonObject = results.get(i);
    if (indexRow < jsonObject.size()) {
        jsonRows = Collections.singletonList(jsonObject.get(indexRow++).findValue(\"value\").asText());
    }
}

调试器第一次迭代中变量 jsonObject 的值是

{
  \"item\": {
    \"type\": \"uri\",
    \"value\": \"http://www.wikidata.org/entity/Q42442324\"
  },
  \"prop\": {
    \"type\": \"uri\",
    \"value\": \"http://www.wikidata.org/prop/direct/P21\"
  },
  \"itemLabel\": {
    \"xml:lang\": \"en\",
    \"type\": \"literal\",
    \"value\": \"Kiisu Miisu\"
  }
}

预期输出为

[
  \"http://www.wikidata.org/entity/Q42442324\",
  \"http://www.wikidata.org/entity/Q42442324\",
  \"Kiisu Miisu\",
  \"http://www.wikidata.org/entity/Q43260736\",
  \"http://www.wikidata.org/prop/direct/P21\",
  \"Paddles\"
]

标签: java json jackson jackson-databind


【解决方案1】:

您可以使用elements() 方法并检查值键是否存在,然后将值添加到列表中。

示例代码

ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(data);

List<String> values = new ArrayList<>();
jsonNode.forEach(jsonObject -> jsonObject.elements().forEachRemaining(valueNode -> {
    if(valueNode.has("value"))
        values.add(valueNode.get("value").asText());
}));
System.out.println(values);

输出:

[http://www.wikidata.org/entity/Q42442324, http://www.wikidata.org/prop/direct/P21, Kiisu Miisu, http://www.wikidata.org/entity/Q43260736, http://www.wikidata.org/prop/direct/P21, Paddles]

【讨论】:

    【解决方案2】:

    这是“Josson & Jossons”的解决方案。我列出了另外 2 个带有条件过滤的示例。

    https://github.com/octomix/josson

    implementation 'com.octomix.josson:josson:1.3.22'
    
    ---------------------------------------------
    
    Josson josson = Josson.fromJsonString(
        "[" +
        "  {" +
        "    \"item\": {" +
        "      \"type\": \"uri\", \"value\": \"http://www.wikidata.org/entity/Q42442324\"" +
        "    }," +
        "    \"prop\": {" +
        "      \"type\": \"uri\", \"value\": \"http://www.wikidata.org/prop/direct/P21\"" +
        "    }," +
        "    \"itemLabel\": {" +
        "      \"xml:lang\": \"en\", \"type\": \"literal\", \"value\": \"Kiisu Miisu\"" +
        "    }" +
        "  }," +
        "  {" +
        "    \"item\": {" +
        "      \"type\": \"uri\", \"value\": \"http://www.wikidata.org/entity/Q43260736\"" +
        "    }," +
        "    \"prop\": {" +
        "      \"type\": \"uri\", \"value\": \"http://www.wikidata.org/prop/direct/P21\"" +
        "    }," +
        "    \"itemLabel\": {" +
        "      \"xml:lang\": \"en\", \"type\": \"literal\", \"value\": \"Paddles\"" +
        "    }" +
        "  }" +
        "]");
    
    JsonNode node = josson.getNode("*.value");
    System.out.println("1.\n" + node.toPrettyString());
    
    node = josson.getNode("~'^item.*'.value");
    System.out.println("2.\n" + node.toPrettyString());
    
    node = josson.getNode("*[value.type='uri']*.value");
    System.out.println("3.\n" + node.toPrettyString());
    

    输出:

    1.
    [ "http://www.wikidata.org/entity/Q42442324", "http://www.wikidata.org/prop/direct/P21", "Kiisu Miisu", "http://www.wikidata.org/entity/Q43260736", "http://www.wikidata.org/prop/direct/P21", "Paddles" ]
    2.
    [ "http://www.wikidata.org/entity/Q42442324", "Kiisu Miisu", "http://www.wikidata.org/entity/Q43260736", "Paddles" ]
    3.
    [ "http://www.wikidata.org/entity/Q42442324", "http://www.wikidata.org/prop/direct/P21", "http://www.wikidata.org/entity/Q43260736", "http://www.wikidata.org/prop/direct/P21" ]
    

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      相关资源
      最近更新 更多