Чтение отдельных событий JSON с использованием Jackson - PullRequest
1 голос
/ 02 мая 2011

У меня есть файл с несколькими объектами JSON, каждый из которых может содержать другие объекты и массивы.

Я хотел бы десериализовать это, предпочтительно используя библиотеку Джексона, в структуру данных, которая поддерживает разделение объектов верхнего уровня, например, массив или список объектов Java HashMap<String, String>, где каждый HashMap будет содержать данные одного объекта JSON верхнего уровня из файла.

Из того, что я видел, вы не можете получить HashMap<String, String> от Джексона, поэтому я должен смириться с HashMap<String, Object>:

List<HashMap<String,Object>> values = new ObjectMapper().readValue(new BufferedReader(new FileReader(path)), new TypeReference<List<HashMap<String, Object>>>() {});

Приведенная выше десериализация работает, как и ожидалось, однако я получаю все данные файла и ни одного объекта JSON, как мне хотелось бы.

Есть идеи?

Спасибо!

1 Ответ

2 голосов
/ 03 мая 2011

После небольшого усилия, вот простой подход, который, кажется, работает:

Reader inputReader = new BufferedReader(new FileReader(filename));

int readEvents = 0;

JsonFactory factory = new JsonFactory();

JsonParser parser = factory.createJsonParser(inputReader);

JsonToken token = null;
ObjectMapper mapper = new ObjectMapper();
HashMap<String,Object> attributes = null;
ArrayList<Map<String,Object>> matchedEvents = new ArrayList<Map<String,Object>>();

try
{
    while ((token=parser.nextToken()) != null)
    {
        if (token == JsonToken.START_OBJECT)
        {
            readEvents++;
            attributes = mapper.readValue(parser,
                     new TypeReference<HashMap<String, Object>>() {});
            if (attributes != null)
            {
                matchedEvents.add(attributes);
            }
        }
    }
}
catch (Exception e)
{
    e.printStackTrace();
}

System.out.println("Read " + readEvents + " events");

Каждый из HashMap<String, Object> объектов, помещенных в вышеупомянутый ArrayList, соответствует одному (top-уровень) JSON-событие.

Методы readValue(), по-видимому, не возвращают объект Map(String, String).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...