Джексон несколько объектов и огромные файлы JSON

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

Таким образом, как и тот, кто задает этот вопрос, у меня есть несколько объектов в файле, и я пытаюсь превратить их в POJO и добавить их в базу данных моего дизайна, чтобы я мог получить доступ к данным быстрее, чем медленно.

Размер файлов здесь составляет порядка десятков ГБ, причем в каждом файле может содержаться до миллионов объектов. Во всяком случае, вот что я имею до сих пор:

<code>ObjectMapper mapper = new ObjectMapper();
Map<String,Object> data = mapper.readValue(new File("foo.json"), Map.class);
System.out.println(data.get("bar"));
</code>

И это прекрасно работает для печати элемента bar первого объекта в foo, но мне нужен способ перебирать каждый элемент таким образом, который не съест всю мою память.

Благодарю.

Ответы на вопрос(3)

Вам не нужно выбирать между потоковой передачей (JsonParser) а такжеObjectMapperделай оба! Пройдите немного с парсером, но затем вызовитеJsonParser.readValueAs(MyType.class) привязать отдельный объект JSON.

Или позвоните по телефонуObjectMapper& APOS; sreadValue() метод передачи JsonParser в соответствующих точках. Или использоватьObjectMapper.reader(Type.class).readValues() и повторить этот путь.

 05 дек. 2012 г., 11:29
+1 за использование обоих! Я использовал потоковую связь + привязку данных, и это здорово с точки зрения простоты и использования памяти.
Решение Вопроса

final InputStream in = new FileInputStream("json.json");
try {
  for (Iterator it = new ObjectMapper().readValues(
      new JsonFactory().createJsonParser(in), Map.class); it.hasNext();)
    System.out.println(it.next());
}
finally { in.close();} }
 04 мая 2012 г., 07:49
@ Хотя вы можете читать вещи какObject или жеJsonNode (модель дерева) вместоMap; а также использоватьObjectMapper.convertValue(map, OtherType.class делать преобразования в фактический тип динамически.
 Tom Carrick03 мая 2012 г., 11:32
Это & quot; работает & quot; но, кажется, вызывает больше проблем, чем решает, так как я никогда не знаю, какие у меня есть типы (есть массивы с большим количеством объектов в объектах), о которых мне, вероятно, придется задать новый вопрос.
 Tom Carrick02 мая 2012 г., 13:07
Не зная слишком много о JSON, я думаю, что последний. Структура файла выглядит примерно так: {бла-бла-бла} {бла-бла-бла} {и т. Д.}
 04 мая 2012 г., 07:47
@Marko рад, что вы нашли способ сделать это, предполагая, что типы одинаковы. Да, я знаю, что это можно заставить работать, имея большой опыт работы с Джексоном; но дьявол кроется в деталях, то есть многие мелочи могут пойти не так, как надо при закрытии потока. Одна важная вещь, что один ДОЛЖЕН использовать один и тот жеJsonParserв противном случае первый будет считан, а буферный блок заполнен вводом; и этот буферизованный контент будет отсутствовать, если будут созданы отдельные парсеры.
 02 мая 2012 г., 12:12
И ваш файл представляет собой один список объектов JSON (что делает его всего одним объектом в целом), или это просто конкатенация объектов JSON (что позволит вам читать их один за другим)?

что у вас есть массив, обертывающий ваши объекты, создайте JsonParser и затем вызовитеreadValuesAs с соответствующим типом. Это возвращает вамIterator со всеми вашими объектами, которые читают файл, когда вы потребляете объекты.

Ваш ответ на вопрос