2013-08-05 2 views
1

Я пытаюсь передать в массив JSON объект по объекту, но мне нужно импортировать его как необработанную строку JSON.Jackson JSON Streaming API: Прочитайте весь объект непосредственно в String

Учитывая массив входных данных следующим образом:

[ 
{"object":1}, 
{"object":2}, 
... 
{"object":n} 
] 

Я пытаюсь перебирать струны:

{"object":1} 
{"object":2} 
... 
{"object":n} 

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

В настоящее время:

//[...] 
//we have read a START_OBJECT token 
JsonNode node = parser.readValueAsTree(); 
String jsonString = anObjectMapper.writeValueAsString(node); 
//as opposed to String jsonString = node.toString() ; 
//[...] 

Я представляю себе здание всей структуры JsonNode включает в себя кучу накладных расходов, что бессмысленно, если я просто reserializing, поэтому я ищу лучшее решение. Что-то вдоль линий это было бы идеально:

//[...] 
//we have read a START_OBJECT token 
String jsonString = parser.readValueAsString() 
//or parser.skipChildrenAsString() 
//[...] 

объекты, очевидно, не так просто, как

{"object":1} 

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

Любые предложения или комментарии оценены. Благодаря!

EDIT: parser.getText() возвращает текущий токен в виде текста (например, START_OBJECT -> "{"), но не остальную часть объекта.

Редактировать 2: Мотивация использования Streaming API заключается в том, чтобы буферизовать объекты по одному. Фактические файлы json могут быть довольно большими, и каждый объект можно отбросить после использования, поэтому мне просто нужно выполнить итерацию.

ответ

4

Невозможно избежать токенизации JSON (иначе синтаксический анализатор не знал бы, где начинаются и заканчиваются объекты и т. Д.), Поэтому он всегда будет включать некоторый уровень синтаксического анализа и генерации.

Но вы можете немного уменьшить накладные расходы путем считывания значений, как TokenBuffer - это внутренний тип Джексона с накладными расходами низкая память/производительность (и используется внутри, когда вещи должны быть помещены в буфер):

TokenBuffer buf = parser.readValueAs(TokenBuffer.class); 
// write straight from buffer if you have JsonGenerator 
jgen.writeObject(buf); 
// or, if you must, convert to byte[] or String 
byte[] stuff = mapper.writeValueAsBytes(); 

Мы можем сделать немного лучше, однако: если вы можете создать JsonGenerator для вывода, просто использовать JsonGenerator.copyCurrentStructure(JsonParser);:

jgen.copyCurrentStructure(jp); // points to END_OBJECT after copy 

Это позволит избежать все размещения объектов; и хотя ему потребуется декодировать JSON, зашифровать как JSON, это будет довольно эффективно. И вы действительно можете использовать это даже для транскодирования - прочитайте JSON, напишите XML/Smile/CSV/YAML/Avro - между любыми форматами, поддерживаемыми Jackson.

Смежные вопросы