2015-06-26 4 views
0

Я пытаюсь создать CSV-файл из динамически созданного массива JSON. Например:Как преобразовать динамический массив JSON в CSV в Java

"People" : 
[{"name" : "Bob", "age" : 5 }, 
{"dob" : "5/2/4", "name" : "Alice"}, 
{"name" : "George"}] 

будет создать файл CSV

name, age, dob 
Bob, 5, 
Alice, , 5/2/4 
George, , 

Как вы можете видеть, мне нужно создать столбец для каждого поля в массиве JSON. Порядок каждой пары ключ-значение в массиве JSON является случайным. Я также не знаю названия ключей заранее. Не беспокойтесь о поле «Люди», в каждом JSON будет только один массив. (Это больше всего будет именем CSV).

Я пробовал использовать Jackson CSV library, но для этого мне необходимо создать предопределенный POJO в качестве среднего уровня (JSON -> POJO -> CSV). Насколько я знаю, Java не позволяет мне динамически генерировать переменные-члены класса во время выполнения, поэтому этот метод не будет работать. То же самое с GSON.

Мне нужно будет сделать это над большим набором данных, поэтому эффективность будет довольно важной. Каким будет лучший способ подойти к этой проблеме?

+0

эй, я имею подобную проблему. Можно ли это решить? – boxfish

ответ

0

Использовать потоковый API для анализа данных json. Jackson, или json-simple, поддерживающий потоковый анализ данных JSON. Для создания CSV используйте CSVWriter из opencsv.

+0

Я очень хорошо знаю доступные технологии и решение высокого уровня. Моя проблема сложнее, чем совместное использование API. Я имею дело с динамически генерируемыми и случайно упорядоченными элементами в массиве JSON. Мой окончательный вывод CSV должен быть структурирован, а столбцы должны быть упорядочены в соответствии с конкретной схемой (как показано выше). – exyrion

0

Вы можете использовать библиотеку json2flat. Это не требует каких-либо POJO's для того, чтобы конвертировать.

Вы просто должны передать свой JSON как строку.

Для следующего JSON:

{ 
    "People" : 
     [ 
      {"name" : "Bob", "age" : 5 }, 
      {"dob" : "5/2/4", "name" : "Alice"}, 
      {"name" : "George"} 
     ] 
} 

Выход:

/People/name,/People/age,/People/dob 
"Bob",5, 
"Alice",,"5/2/4" 
"George",, 
Смежные вопросы