Иногда нам нужно найти значение в структурном документе, таком как JSON, YAML. Также потребуется некоторое время, чтобы найти значение по пути к документу.
Структурный документ может быть легко преобразован в объект списка карт с помощью библиотек синтаксического анализа. Благодаря этому мы можем получить значение документа, используя массив ключей и индексов.
Чтобы сделать это,
Во-первых, нам нужно получить библиотеку синтаксического анализа, которая может анализировать JSON или YAML в структуру списка карт Java. Эту библиотеку можно легко найти в хранилище интернет-библиотек, таком как Maven Central.
Для этого поста мы предполагаем, что мы ориентируемся на документ JSON. Это внизу
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters": {
"aaa": {
"bbb": {
"ccc": {
"value": 123.0
}
}
},
"batter": [
{
"id": "1001",
"type": "Regular"
},
{
"id": "1002",
"type": "Chocolate"
},
{
"id": "1003",
"type": "Blueberry"
},
{
"id": "1004",
"type": "Devil\u0027s Food"
}
]
},
Мы используем рекурсивный алгоритм для поиска значения, и если путь не может найти значение или путь не существует, он вернет значение null.
Заполненный код находится ниже
/**
* To find value with path array on structural data
*
* @param obj
* @param keys
* @return
*/
public static Object findValue(Object obj, Object[] keys) {
if (obj instanceof List) {
List list = (List) obj;
if (keys.length == 1) {
if (keys[0] instanceof Integer && list.size() > (int) keys[0]) {
return list.get((int) keys[0]);
}
} else if (keys.length > 1 && list.size() > 0) {
int idx = (int)keys[0];
if(idx < list.size()) {
return findValue(list.get((int) keys[0]), Arrays.copyOfRange(keys, 1, keys.length));
}
}
} else if (obj instanceof Map) {
Map map = (Map) obj;
if (keys.length == 1 && map.containsKey(keys[0])) {
return map.get(keys[0]);
} else if (keys.length > 1 && map.containsKey(keys[0])) {
if(keys.length > 0) {
return findValue(map.get(keys[0]), Arrays.copyOfRange(keys, 1, keys.length));
}
}
}
return null;
}
Что ж, давайте начнем тест прямо сейчас
Приведенный выше документ JSON сохраняется в файл с именем “sample.json”, код ниже читается как “sample.json”, а результат – изображение ниже.
Gson gson = new Gson(); Mapmap = gson.fromJson(new FileReader("simple.json"), Map.class); Object[] keys = new Object[] {"batters", "batter", 3, "type"}; Object obj = findValue(map, keys); System.out.println(obj);
Оригинал: “https://dev.to/kooin/how-to-find-value-using-path-array-with-structural-document-in-java-3lic”