Выравнивание данных JSON в отдельные строки - PullRequest
0 голосов
/ 29 января 2019

Меня интересует выравнивание JSON с несколькими слоями вложенных массивов объектов.В идеале я хотел бы сделать это на Java, но кажется, что библиотека Pandas на python может быть хороша для этого.

Кто-нибудь знает хорошую Java-библиотеку для этого?

Я нашел эту статью ( Создание Pandas DataFrame из глубоко вложенного JSON ), используя pandas и jqи мое решение почти работает, но вывод, который я получаю, не совсем так, как ожидалось.Вот мой пример кода

json_data = '''{ "id": 1,
"things": [
    {
        "tId": 1,
        "objs": [{"this": 99},{"this": 100}]
    },
    {
        "tId": 2,
        "objs": [{"this": 222},{"this": 22222}]
    }
]
 }'''

rule = """[{id: .id, 
        tid: .things[].tId,
        this: .things[].objs[].this}]"""
out = jq(rule, _in=json_data).stdout
res = pd.DataFrame(json.loads(out))

Проблема в том, что вывод, который я получаю, таков:

   id   this  tid
0   1     99    1
1   1    100    1
2   1    222    1
3   1  22222    1
4   1     99    2
5   1    100    2
6   1    222    2
7   1  22222    2

Я ожидаю увидеть

   id   this  tid
0   1     99    1
1   1    100    1
3   1    222    2
4   1  22222    2

Любые советыо том, как заставить это работать, было бы отлично, различные решения или вариант Java!

Заранее спасибо!

Крейг

1 Ответ

0 голосов
/ 29 января 2019

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

С вашим вводом следующее выражение jq, которое делает вложенную итерацию достаточно ясной, выдает результаткак показано:

.id as $id
| .things[] as $thing
| $thing.objs[]
| [$id, .this, $thing.tId]
| @tsv

Выходные данные

1   99  1
1   100 1
1   222 2
1   22222   2

Правило

Так что, по-видимому, ваше правило должно выглядеть примерно так:

[{id} + (.things[] | {tid: .tId} + (.objs[] | {this}))]

или еслиВы хотите сделать вложенную итерацию более понятной:

[ .id as $id
  | .things[] as $thing
  | $thing.objs[]
  | {id: $id, this, tid: $thing.tId} ]

Запуск jq в java

Помимо processBuilder, вы можете взглянуть на следующие оболочки:

...