programing

Jackson JSON: json-tree에서 노드 이름 가져오기

shortcode 2023. 4. 3. 22:54
반응형

Jackson JSON: json-tree에서 노드 이름 가져오기

Jackson을 사용하여 JSON 트리에서 노드 이름을 수신하려면 어떻게 해야 합니까?JSON-File은 다음과 같습니다.

{  
    node1:"value1",
    node2:"value2",
    node3:{  
        node3.1:"value3.1",
        node3.2:"value3.2"
    }
}

있습니다

JsonNode rootNode = mapper.readTree(fileReader);

그런 게 필요해요

for (JsonNode node : rootNode){
    if (node.getName().equals("foo"){
        //bar
  }
}

감사해요.

잭슨 2+의 경우(com.fasterxml.jackson)의 방법은 조금 다릅니다.

Iterator<Entry<String, JsonNode>> nodes = rootNode.get("foo").fields();

while (nodes.hasNext()) {
  Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodes.next();

  logger.info("key --> " + entry.getKey() + " value-->" + entry.getValue());
}

이 답변은 Jackson 2+ 이전 버전(원래 1.8용으로 작성)에 적용됩니다.Jackson 의 새로운 버전에서 동작하는 버전에 대해서는, @SupunSameera 의 답변을 참조해 주세요.


"node name"의 JSON 용어는 "key"입니다.에는 키가 포함되어 있지 않기 때문에, 다른 방법으로 반복할 필요가 있습니다.

for (Map.Entry<String, JsonNode> elt : rootNode.fields())
{
    if ("foo".equals(elt.getKey()))
    {
        // bar
    }
}

만 표시하면 다음과 같이 간단하게 할 수 있습니다.

for (String key : rootNode.fieldNames())
{
    if ("foo".equals(key))
    {
        // bar
    }
}

키가 있는 노드를 찾으려면"foo", 직접 액세스 할 수 있습니다.따라서 루프를 사용하는 것보다 더 나은 성능(정시 검색)과 더 깨끗한/깨끗한 코드가 생성됩니다.

JsonNode foo = rootNode.get("foo");
if (foo != null)
{
    // frob that widget
}

fields()와 field Names()는 모두 나에게 동작하지 않았다.그리고 나는 키를 반복하는 방법을 찾기 위해 꽤 시간을 들여야 했다.그것을 할 수 있는 두 가지 방법이 있다.

하나는 맵으로 변환하는 것입니다(더 많은 공간을 차지합니다).

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> result = mapper.convertValue(jsonNode, Map.class);
for (String key : result.keySet())
{
    if(key.equals(foo))
    {
        //code here
    }
}

다른 하나는 String 반복기를 사용하는 것입니다.

Iterator<String> it = jsonNode.getFieldNames();
while (it.hasNext())
{
    String key = it.next();
    if (key.equals(foo))
    {
         //code here
    }
}

자세한 내용은 이쪽:

이 방법은 유효하지만:

 JsonNode rootNode = objectMapper.readTree(file);
 Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
 while (fields.hasNext()) {
    Map.Entry<String, JsonNode> entry = fields.next();
    log.info(entry.getKey() + ":" + entry.getValue())
 }

이것은, 이하에 해당하지 않습니다.

JsonNode rootNode = objectMapper.readTree(file);

while (rootNode.fields().hasNext()) {
    Map.Entry<String, JsonNode> entry = rootNode.fields().next();
    log.info(entry.getKey() + ":" + entry.getValue())
}

그러니까 주의해서 선언해 주세요.Iterator변수로 사용할 수 있습니다.

반드시 를 사용해 주세요.fasterxml보다 라이브러리codehaus.

JsonNode root = mapper.readTree(json);
root.at("/some-node").fields().forEachRemaining(e -> {
                              System.out.println(e.getKey()+"---"+ e.getValue());

        });

한 줄에 잭슨 2+

언급URL : https://stackoverflow.com/questions/7653813/jackson-json-get-node-name-from-json-tree

반응형