Используйте JQ, чтобы извлечь массив путей, а также заменить эти значения своим собственным путем. - PullRequest
0 голосов
/ 10 января 2020

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

Я получу массив с JSON путями, которые необходимо быть извлечены.

Эти выбранные ключи и их значения создадут файл свойств, а также будут заменены в самом JSON.

Пример:

ВХОДНЫЕ ARGS: "description" "assets.url"
^^^ мы можем изменить этот формат INPUT на assets []. url, если это упрощает обработку массивов ^^^

JSON:

 {
        "title": "TEST TITLE",
        "description": "TEST DESCRIPTION",
        "type": "Promo",
        "assets": [{
           "content_type": "image",
           "url": "https://www.fakesite.com/image.jpg"
           }, {
           "content_type": "image",
           "url": "https://www.fakesite.com/image2.jpg"
        }]
    }

Ожидаемый результат:

1) файл свойств (ключ = значение)

description=TEST DESCRIPTION
assets_0_url=https://www.fakesite.com/image.jpg
assets_1_url=https://www.fakesite.com/image2.jpg

2) преобразованный JSON файл

 {
        "title": "TEST TITLE",
        "description": "${description}",
        "type": "Promo",
        "assets": [{
           "content_type": "image",
           "url": "${assets_0_url}"
           }, {
           "content_type": "image",
           "url": "${assets_1_url}"
        }]
    }

Ключи OUTPUT (в данном случае: description, assets_0_url, assets_1_url) не обязательно должны следовать этому формату, но должны быть пронумерованы и уникальны в случае массивов.

Только требуется, чтобы ключи файла свойств OUTPUT совпадали с замененными значениями в OUTPUT JSON.

PROPERTY:

description = ОПИСАНИЕ ИСПЫТАНИЯ

JSON:

"description": " $ {description} ",

Что Я сделал так:

FIELDS="description\|assets.*url"
OUTPUT=$(jq -r 'paths(scalars) as $p | "\($p|join("_"))=\(getpath($p))"' $FILE | grep $FIELDS)
printf "%s\r" "$OUTPUT" > json.properties

Что дает мне следующий json .properties файл:

description=TEST DESCRIPTION
assets_0_url=https://www.fakesite.com/image.jpg
assets_1_url=https://www.fakesite.com/image2.jpg

Это возможно с JQ?

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

1 Ответ

0 голосов
/ 10 января 2020

Следующее обращается к большей части требований, но оставляет анализ "INPUT ARGS" в качестве упражнения.

Файл свойств

def propertyValue(property):
  "\(property)=\(.[property])";

def propertyValue(arrayvaluedproperty; property):
  .[arrayvaluedproperty] as $a
  | range(0; $a|length) as $i
  | "\(arrayvaluedproperty)_\($i)_\(property)=\($a[$i][property])";

propertyValue("description"),
propertyValue("assets"; "url")

Преобразовано JSON

def updateProperty(p):
  .[p] = "${\(p)}";

def updateProperty(arrayvaluedproperty; p):
  .[arrayvaluedproperty] as $a
  | reduce range(0; $a|length) as $i (.;
    .[arrayvaluedproperty][$i] = "${\(arrayvaluedproperty)_\($i)_\(p)}");


updateProperty("description")
| updateProperty("assets"; "url")
...