Расширение этот вопрос.
Я хочу получить JSON, который не является парой значений ключа и может содержать переменные поля, которые будут известны только после его анализа, примерно так:
{
"Id":"1223-SHD5-33FA-29T7",
"Properties" : [
{
"someProperty":"someValue",
"anotherPropertry":"anotherValue",
"subProperty" : {
"IP":[
"113.73.47.114",
"144.156.146.219",
"153.103.248.24"
]
},
"oneMoreProperty": [
"someOtherValue"
]
}
]
}
Как мне получить и проанализировать это, если я знаю список свойств, которые могут быть включены в тело JSON?




Вы можете использовать jacksonObjectMapper.readValue как Map.class и повторять
каждая пара КЛЮЧЕВОЕ ЗНАЧЕНИЕ с map.entrySet()
ObjectMapper objectMapper = new ObjectMapper();
HashMap<Object, Object> readValue =
objectMapper.readValue(json.getBytes(), HashMap.class);
for (Map.Entry<Object, Object> e : readValue.entrySet()) {
System.out.println(e.getKey());
/* Here check e.getValue() isinstance of Map
then iterate that too */
}
Вы можете использовать API Jackson DataBind, чтобы получить все пары ключ-значение.
String json = "{\"Id\":\"1223-SHD5-33FA-29T7\",\"Properties\":[{\"someProperty\":\"someValue\",\"anotherPropertry\":\"anotherValue\",\"subProperty\":{\"IP\":[\"113.73.47.114\",\"144.156.146.219\",\"153.103.248.24\"]},\"oneMoreProperty\":[\"someOtherValue\"]}]}";
ObjectMapper om = new ObjectMapper();
JsonNode jsonNode = om.readTree(json);
for (Map.Entry<String, JsonNode> elt : jsonNode.fields())
{
//get keys and values
}
Вы можете использовать Jay-Way API, чтобы получить значение на основе пути. Вы также можете использовать Reg-Expressions для получения необходимого значения.
String json = "{\"Id\":\"1223-SHD5-33FA-29T7\",\"Properties\":[{\"someProperty\":\"someValue\",\"anotherPropertry\":\"anotherValue\",\"subProperty\":{\"IP\":[\"113.73.47.114\",\"144.156.146.219\",\"153.103.248.24\"]},\"oneMoreProperty\":[\"someOtherValue\"]}]}";
ReadContext ctx = JsonPath.parse(json);
String id = ctx.read("$.Id");
String someProperty = ctx.read("$.Properties[0].someProperty");
System.out.println(id);
System.out.println(someProperty);
Вы можете получить зависимость, используя приведенную ниже
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.4.0</version>
</dependency>
С Jay-Way вы не будете обходить все дерево каждый раз, когда ищете значение ключа.
Если вы просто используете HashMap для чтения данных в IMHO,
readTree()вместоreadValue()- лучший подход. Он возвращает JsonNode, который позволяет получить доступ ко всем данным (всем уровням), используя один и тот же интерфейс.