使用' jq'从现有的json文件创建对象

时间:2017-12-26 20:39:42

标签: json object jq

我有一个messages.json文件

[
    {
        "id": "title",
        "description": "This is the Title",
        "defaultMessage": "title",
        "filepath": "src/title.js"
      },
      {
        "id": "title1",
        "description": "This is the Title1",
        "defaultMessage": "title1",
        "filepath": "src/title1.js"
      },
      {
        "id": "title2",
        "description": "This is the Title2",
        "defaultMessage": "title2",
        "filepath": "src/title2.js"
      },
      {
        "id": "title2",
        "description": "This is the Title2",
        "defaultMessage": "title2",
        "filepath": "src/title2.js"
      },
    ]

我想创建一个对象

{
    "title": "Dummy1",
    "title1": "Dummy2",
    "title2": "Dummy3",
    "title3": "Dummy4"
  }

从顶部开始。 到目前为止我已经

jq '.[] | .id' src/messages.json;

它确实给了我ID 如何添加一些随机文本并使新对象如上所述?

我们还可以创建一个新的JSON文件,并使用jq将新创建的对象写入其中吗?

1 个答案:

答案 0 :(得分:0)

您的输出包含“title3”所以我假设您打算在输入中第二次出现“title2”应该引用“title3”。

通过这个假设,以下jq程序似乎可以做你想要的:

map( .id )
| . as $in
| reduce range(0;length) as $i ({};
    . + {($in[$i]): "dummy\(1+$i)"})

在单词中,提取.id的值,然后将每个值转换为表单的对象:{(.id) : "dummy\(1+$i)"}

这使用字符串插值,并产生:

{
  "title": "dummy1",
  "title1": "dummy2",
  "title2": "dummy3",
  "title3": "dummy4"
}

无还原溶液

map(.id )
| [., [range(0;length)]]
| transpose
| map( {(.[0]): "dummy\(.[1]+1)"})
| add

输出

  

我们还可以创建一个新的json文件,并使用jq将新创建的对象写入其中吗?

是的,只需使用输出重定向:

jq -f program.jq messages.json > output.json

附录

  

我想要一个父对象“de”到已创建的json文件对象

您可以将以上任一解决方案管道传输到:{de: .}