Как преобразовать JSON с массивами в TSV с JQ, сохраняя структуру массива? - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно получить содержимое таблицы mysql, в которой есть несколько полей, в которых хранятся данные в виде массива JSON, и включить их в другую таблицу базы данных.Мне нужно использовать REST API для этого, и он возвращает записи в формате JSON.Из соображений производительности мне нужен этот вывод для возврата на вкладку.Поэтому я использую jq's @ tsv.

. Это прекрасно работает, пока не встретит поле, содержащее массив JSON внутри, jq потом жалуется, что «массив недопустим в строке csv».

Вот пример JSON

{
"records": [
 {
        "id": 1,
        "metadata": {
            "description": null,
            "width": 0,
            "height": 0,
            "secondaryColor": "#fff",
            "callToAction": [
                {
                    "link": "/truc.html",
                    "value": "nice",
                    "colors": {
                        "primary": "transparent;",
                        "secondary": "transparent;"
                    }
                }
            ]
        },
        "parent": null
    }
        ]
}

Мне бы хотелось получить следующий результат

1  null  0  0  #fff  [ { "link": "/truc.html", "value": "nice", "colors": { "primary": "transparent;", "secondary": "transparent;" } } ]  null

, поэтому я хочу, чтобы массив был неповрежденным, а просто возвращался в одномстрока

Итак, я написал это

jq -c --raw-output '.records[]|[.id,.metadata.description,.metadata.width,.metadata.height,.metadata.secondaryColor,.metadata.callToAction,.parent]|@tsv

Но у меня есть ошибка "массив недопустим в строке CSV"

Возможно ли это?

Спасибо

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Сначала необходимо JSON-кодировать призыв к действию.

% jq -c --raw-output '.records[] |
[.id, .metadata.description, 
      .metadata.width,
      .metadata.height,
      .metadata.secondaryColor,
      (.metadata.callToAction|@json),  # convert this field to JSON first
      .parent
] | @tsv' tmp.json
1       0   0   #fff    [{"link":"/truc.html","value":"nice","colors":{"primary":"transparent;","secondary":"transparent;"}}]
0 голосов
/ 20 марта 2019

Поскольку указанная цель включает в себя «ноль» в выходных данных, вы можете рассмотреть возможность сопоставления всех выбранных значений с использованием tojson, например, используя map(tojson). С примером JSON это даст:

1   null    0   0   "#fff"  [{"link":"/truc.html","value":"nice","colors":{"primary":"transparent;","secondary":"transparent;"}}]   null

Обратите внимание, что строка #fff заключена в кавычки. Если вы не хотите, чтобы строки заключались в кавычки таким образом, вы можете рассмотреть следующие вопросы:

map(if type == "string" then . else tojson end)
...