jq 如何将文件中的对象添加到文件中的数组中

jq 如何将文件中的对象添加到文件中的数组中

我有一个文件,数组中包含以下内容。我FAVORITE_FULL在 Bash 脚本中这样称呼它。

[
    {
        "name": "__SOLOPIANO__ by rautemusik (rm.fm)",
        "url_resolved":"https://rautemusik-de-hz-fal-stream14.radiohost.de/solopiano?ref=radiobrowser&listenerid=31363235323832333936-326130333a343030303a33373a34323a633466653a346366663a666561373a38393431-3533343132-53747265616d436865636b426f742f302e312e30",
        "favicon": "https://i.ibb.co/48KRX7M/solopiano.jpg",
        "tags": "ambient,jazz,smooth lounge,smooth,smooth jazz",
        "countrycode": "DE",
        "language": "english,deutsch german,deutsch,german"
    },
    {
        "name": "- 0 N - Smooth Jazz",
        "url_resolved":"http://0n-jazz.radionetz.de/0n-jazz.aac",
        "favicon": "http://www.0nradio.com/images/favicon/mstile-144x144.png",
        "tags": "ambient,jazz,smooth lounge,smooth,smooth jazz",
        "countrycode": "DE",
        "language": "german"
    },
    ...
]

在此过程中,我在文件中创建了一个 JSON。我TEMP_FILE2在我的脚本中称之为。

{
        "name": ".977 Smooth Jazz",
        "url_resolved":"http://19353.live.streamtheworld.com:3690/977_SMOOJAZZ_SC",
        "favicon": "http://977music.com/images/logo.gif",
        "tags": "jazz,smooth jazz",
        "countrycode": "US",
        "language": "english"
    }

现在我想添加TEMP_FILE2FAVORITE_FULL.我根据以下尝试这个线程

1.

jq '.[] += ["$TEMP_FILE2"]' "$FAVORITE_FULL" "$TEMP_FILE2"

这将返回以下错误。

jq: error (at /Users/shinichiokada/.tera/favorite.json:33): object ({"name":"__...) and array (["$TEMP_FIL...) cannot be added
jq: error (at /tmp/tera_favorite2.json:1): Cannot iterate over null (null)
jq --argjson TEMP "$(cat "$TEMP_FILE2")" '.[] += [$TEMP]' "$FAVORITE_FULL"

这将返回以下错误。

jq: error (at /Users/shinichiokada/.tera/favorite.json:33): object ({"name":"__...) and array ([{"changeuu...) cannot be added

如何将一个文件中的 JSON 添加到另一个文件中的数组中?

答案1

jq '. += [input]' "$FAVORITE_FULL" "$TEMP_FILE2"

这会将第二个文件中的对象添加到第一个文件的数组中,方法是将 . 添加[input]到数组中+=。该input函数读取下一个输入文件,我们在这里使用它来将 的内容读$TEMP_FILE2入一个数组,该数组被添加到数组中$FAVORITE_FULL(对象不能按原样添加到数组中+=,需要将其放入首先进入它自己的数组)。

或者,

jq '[ .[], input ]' "$FAVORITE_FULL" "$TEMP_FILE2"

这将从第一个文件扩展数组,然后从中创建一个新数组,并将第二个文件中的对象作为最后一个元素。

您还可以使用--slurp-s

jq -s '.[0] += [.[1]] | .[0]' "$FAVORITE_FULL" "$TEMP_FILE2"

这会将所有输入文件读取到一个数组中,第一个文件的数组位于 中.[0],要添加的对象位于 中.[1]。然后我们为新对象创建一个数组[.[1]] ,并将其添加到该数组中。最后我们输出更新后的.[0]数组。

与上面的替代解决方案有同样的变化:

jq -s '[ .[0][], .[1] ]' "$FAVORITE_FULL" "$TEMP_FILE2"

我还注意到,您的尝试只需--argjson稍加调整即可:

jq --argjson t "$(cat "$TEMP_FILE2")" '. += [$t]' "$FAVORITE_FULL"

注意.(一个数组)代替你的.[](一组对象,一个扩展数组)。

或者,使用--slurpfile

jq --slurpfile t "$TEMP_FILE2" '. += $t' "$FAVORITE_FULL"

注意$t而不是[$t]这里。当我们使用 slurp 模式时,被 slurp 的数据总是放入一个数组中,最后一个示例中$t包含单个对象的数组也是如此。$TEMP_FILE2

相关内容