#java #json #jackson #jsonnode
#java #json #джексон #jsonnode
Вопрос:
Я хочу удалить столбцы blob-объектов из объектов JSON. Мне нужно проверить, имеет ли какой-либо объект «@type»: «blob», весь столбец должен быть удален. Например. ниже приведена запись из базы данных. ‘опыт’, ‘точки попадания’, ‘имя’, ‘uuid’, ‘изображение’ (необязательно) являютсястолбцы. поскольку запись имеет столбец blob, то есть изображение. Он должен быть удален.
Пример ввода-вывода:
{
"experience": 14248,
"hitpoints": 9223372036854775807,
"name": "Aaron1",
"uuid": "78edf902-7dd2-49a4-99b4-1c94ee286a33",
"image": {
"@type": "blob",
"content_type": "image/jpeg",
"digest": "sha1–4xlj1AKFgLdzcD7a1pVChrVTJIc=",
"length": 3888349
}
},
{
"experience": 14252,
"hitpoints": 92233720368512345,
"name": "Aaron2",
"uuid": "78edf902-7dd2-49a4-99b4-1a94ff286a45",
}
Пример O / P:
{
"experience": 14248,
"hitpoints": 9223372036854775807,
"name": "Aaron1",
"uuid": "78edf902-7dd2-49a4-99b4-1c94ee286a33",
},
{
"experience": 14252,
"hitpoints": 92233720368512345,
"name": "Aaron2",
"uuid": "78edf902-7dd2-49a4-99b4-1a94ff286a45",
}
Есть ли способ добиться этого с помощью оптимизированного синтаксического анализа JSON.
В настоящее время моя логика выполняется следующим образом:
- Я просматриваю весь объект, используя функцию, в которой я перебираю узел, чтобы прочитать объект.
- Вызов функции ‘blobChecker’ для каждого объекта.
- Присвоение null узлу, если он содержит большой двоичный объект.
- Пропуск нулевого узла в исходной функции, которая вызывает blobChecker
Исходная функция для parseJSON:
parseJsonNode(JsonNode node){
blobNodeChecker(node);
if(node!=null)
//The funtionality
}
Функция blobNodeChecker:
blobNodeChecker(JsonNode node) {
Boolean isBlob = false;
String blobNode = null;
Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
while (fields.hasNext()) {
Map.Entry<String, JsonNode> next = fields.next();
String key = next.getKey();
String val = next.getValue().toString().toLowerCase();
if (key.equals("@type")) {
if (val.contains("blob")) {
isBlob = true;
break;
}
}
}
if (isBlob) {
node = null;
}
return node;
}
Ответ №1:
Как насчет чего-то подобного ниже. Вы можете напрямую прочитать путь и в зависимости от этого удалить узел. Нет необходимости перебирать все ключи.
String tt = " {"
" "experience": 14248,"
" "hitpoints": 9223372036854775807,"
" "name": "Aaron1","
" "uuid": "78edf902-7dd2-49a4-99b4-1c94ee286a33","
" "image": {"
" "@type": "blob","
" "content_type": "image/jpeg","
" "digest": "sha1–4xlj1AKFgLdzcD7a1pVChrVTJIc=","
" "length": 3888349"
" }"
" }";
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
JsonFactory factory = mapper.getFactory();
JsonParser createParser = factory.createParser(tt);
JsonNode actualObj1 = mapper.readTree(createParser);
JsonNode path = actualObj1.path("image").path("@type");
if( path != null amp;amp; "blob".equalsIgnoreCase(path.asText())) {
((ObjectNode)actualObj1).remove("image");
}
System.out.println(actualObj1.toString());