Как перебрать массив JSON в bash из jq

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

Когда вы пишете worksheet["A2"], вы действительно вызываете функцию-член worksheet

worksheet имеет функцию-член с именем [], которая принимает string и возвращает object

. Подпись функции-члена [] выглядит как object this[string id]

Таким образом, функция worksheet["A2"] возвращает то, что является object. Это может быть int или string или многое другое. Все компиляторы знают, что это будет object.

В этом примере вы возвращаете Func<object>. Это прекрасно, потому что Func<object> - a object. Тем не менее, вы затем передаете результат этой функции в качестве параметра в другую функцию.

Проблема заключается в том, что компилятор знает, что worksheet["A2"] возвращает object. Это так же специфично, как и компилятор. Таким образом, компилятор видит, что worksheet["A2"] является объектом, и вы пытаетесь передать объект функции, которая не принимает object в качестве параметра.

Итак, здесь вы должны сообщить компилятору " hey dummy, это Func<object> ", поместив возвращаемый объект в правильный тип.

worksheet.Add("C3", CellFactories.DoAdd(worksheet["A2"], worksheet["B1"]));

можно переписать как

worksheet.Add("C3", CellFactories.DoAdd((Func<object>)worksheet["A2"], (Func<object>)worksheet["B1"]));

Теперь компилятор знает, что , хотя функция [] возвращает object, она может относиться к ней как к Func<object>.

сторона примечания: вы, вероятно, слишком много делаете на одной строке. Это может быть трудно для людей читать в будущем.

Почему вызываемый метод «видит» аргумент как другой тип, чем GetType () возвращает?

Компилятор знает, что worksheet[] возвращает объект. Компилятор не может вызывать GetType() во время компиляции.

Что хорошего в методе GetType ()?

Существует довольно много видов использования и злоупотребления методом GetType(), но это совершенно другое обсуждение. ;)

Итак, компилятор ничего не предполагает о типах. Это хорошая вещь , потому что вы получаете ошибку времени компиляции, когда пытаетесь вставить этот квадратный штифт в круглое отверстие. Если компилятор не жаловался, эта ошибка будет отображаться во время выполнения, что означает, что вам, вероятно, понадобится единичный тест для обнаружения проблемы.

Вы можете обойти эту проблему, сообщив компилятору «Я знаю для того, чтобы эта вещь была круглой привязкой, поверьте мне ». и затем он скомпилируется. Если вы лжете компилятору, вы получите ошибку во время выполнения этого кода.

Это называется «статическая типизация». Противоположная философия называется «динамическая типизация», где проверки типов выполняются во время выполнения. Static vs dynamic - длительная дискуссия, и вам, вероятно, следует исследовать ее самостоятельно, если вам интересно.

1
задан bozdoz 1 March 2019 в 21:47
поделиться

3 ответа

Используйте while для чтения целых строк, а не для итерации по словам , полученным в результате подстановки команд.

while IFS= read -r obj; do
    ...
done < <(jq -c '.[]' posts.json)
0
ответ дан chepner 1 March 2019 в 21:47
поделиться

Может быть, это подойдет вам:

Сделайте исполняемый файл bash, возможно, назовите его wpfunction.sh

#!/bin/bash

wp post create \
  --post_type="$1"\
  --post_title="$2" \
  --post_content="$3" \
  --post_status="$4"

Затем запустите jq на вашем posts.json и направьте его в xargs

jq -M -c '.[] | [.post_type, .post_title, .post_content, .post_status][]' \
posts.json | xargs -n4 ./wpfunction`

Я экспериментирую, чтобы увидеть, как это будет обрабатывать post_content, содержащий цитаты ...

0
ответ дан Addison 1 March 2019 в 21:47
поделиться

Сначала сгенерируйте массив аргументов, которые вы хотите передать, затем преобразуйте в форму, совместимую с оболочкой, используя @sh. Затем вы можете перейти к xargs для вызова команды.

$ jq -r '.[] | ["post", "create", (to_entries[] | "--\(.key)=\(.value|tojson)")] | @sh' input.json | xargs wp
0
ответ дан Jeff Mercado 1 March 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: