Извлечение объектов из массива с помощью Jackson Streaming API - PullRequest
1 голос
/ 03 мая 2019

Я пытался использовать потоковый API Джексона в Java для обработки следующего:

{
  "objs": [
    {
      "A": {
        "a": "b",
        "c": "d"
      },
      "B": {
        "e": "f",
        "g": "h"
      },
    },
    {
      "C": {
        "i": "j",
        "k": "l"
      },
      "D": {
        "m": "n",
        "o": "p"
      },
    }
  ]
}

Для каждого объекта верхнего уровня в массиве под ключом objs (в этом примере объект с ключами "A" и "B", а другой объект с ключами "C" и "D") я хочу извлекать объекты каждый в виде необработанной строки; Потенциально у меня будут десятки тысяч таких для анализа, поэтому я не хочу отображать их на объекты модели.

Мне трудно понять, как это сделать, потому что, когда я перебираю токены JSON, я не могу определить логическое условие, которое говорит мне, что я нахожусь в точном начале одного из этих объектов. Кроме того, как только я определил это начало, как мне извлечь объект с помощью потокового API, а затем перейти к следующему?

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

1 Ответ

0 голосов
/ 05 мая 2019

Ваш сценарий должен быть легко решен с помощью библиотеки JsonPath , которая решает подобные проблемы. Ниже приведен пример печати всех необходимых подузлов:

import com.jayway.jsonpath.JsonPath;

import java.io.File;
import java.util.List;
import java.util.Map;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        List<Map> nodes = JsonPath.parse(jsonFile).read("$.objs.*.*");
        nodes.forEach(System.out::println);
    }
}

печать:

{a=b, c=d}
{e=f, g=h}
{i=j, k=l}
{m=n, o=p}

Используя Jackson, вы можете сделать это при заданной JSON полезной нагрузке в виде дерева, используя метод readTree. См. Пример ниже:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

import java.io.File;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(jsonFile);
        ArrayNode objs = (ArrayNode) root.at("/objs");
        objs.forEach(node -> {
            node.forEach(property -> {
                System.out.println(property.toString());
            });
        });
    }
}

Над отпечатками кодов:

{"a":"b","c":"d"}
{"e":"f","g":"h"}
{"i":"j","k":"l"}
{"m":"n","o":"p"}
...