2015-04-30 6 views
3

Я пытаюсь получить json путь значения из строки json с jackson. Поскольку я не мог найти какую-либо функцию внутри джексона, дающую мне этот результат, я хотел создать свою собственную функцию.Получить json путь значения с jackson

Так что я сделал эту функцию:

public static String getJsonPath(Map.Entry<String, JsonNode> jsonNode, String valueSearched) { 
    String res = ""; 
    String key = jsonNode.getKey(); 
    JsonNode value = jsonNode.getValue(); 
    if (value.isValueNode() && value.equals(valueSearched)) { // Here the value change to a ValueNode and the key weirdly equals to "". 
     return res + key; 
    } else { 
     if (value.isContainerNode()) { 
      if (value.isObject()) { 
       Iterator<Map.Entry<String, JsonNode>> elements = value.fields(); 
       while (elements.hasNext()) { 
        Map.Entry<String, JsonNode> element = elements.next(); 
        res += "." + element.getKey() + generateJsonPathArgumentFromJson(element, valueSearched); 
       } 
      } else { 
       int i = 0; 
       ArrayNode arrayNode = (ArrayNode) jsonNode; 
       Iterator<Map.Entry<String,JsonNode>> elements = arrayNode.fields(); 
       while (elements.hasNext()) { 
        Map.Entry<String, JsonNode> element = elements.next(); 
        i++; 
        res += "(" + i + ")" + generateJsonPathArgumentFromJson(element, valueSearched); 
       } 
      } 
     } 
    } 
    return ""; 
} 

Почему ключ получает равен «» после того, как первый, если? Или есть лучший способ построить json-путь для определенного значения?

ответ

2

Просто получить решения:

protected static String generateJsonPathArgumentFromJson(JsonNode jsonNode, String valueSearched) { 
    if (jsonNode.isValueNode() && !jsonNode.asText().equals(valueSearched)) { 
     return null; 
    } else { 
     if (jsonNode.isContainerNode()) { 
      if (jsonNode.isObject()) { 
       Iterator<Map.Entry<String, JsonNode>> elements = jsonNode.fields(); 
       while (elements.hasNext()) { 
        Map.Entry<String, JsonNode> element = elements.next(); 
        String res = generateJsonPathArgumentFromJson(element.getValue(), valueSearched); 
        if (res != null) { 
         return "." + element.getKey() + res; 
        } 
       } 
      } else { 
       int i = 0; 
       Iterator<JsonNode> elements = jsonNode.elements(); 
       while (elements.hasNext()) { 
        JsonNode element = elements.next(); 
        String res = generateJsonPathArgumentFromJson(element, valueSearched); 
        if (res != null) { 
         return "(" + i + ")" + res; 
        } 
        i++; 
       } 
      } 
     } 
    } 
    return ""; 
} 

Я уверен, что есть лучший способ сделать это, но по крайней мере это работает :)