首页 > 解决方案 > 使用从流中提取的值创建一个数组

问题描述

我正在尝试使用 jq 来制定 xhr 的请求参数。

请求必须如下所示:

{
  "ns:inputArticleItemList": {
    "#namespaces": {
      "ns": "http://www.unknown.com/ccp/basit/service/article/api"
    },
    "articles": [
      {
        "articleID": "000000000002158654",
        "insertCode": "62",
        "calculatePrice": true,
        "checkAvailability": true,
        "findExclusions": true
      },
      {
        "articleID": "000000000002147829",
        "insertCode": "62",
        "calculatePrice": true,
        "checkAvailability": true,
        "findExclusions": true
      },
      {
        "articleID": "000000000002103650",
        "insertCode": "62",
        "calculatePrice": true,
        "checkAvailability": true,
        "findExclusions": true
      },
    ]
  }
}

我要使用的 JSON 是这样的:

{
  "2201299": {
    "title": "this is the product description for article 2201299",
    "prop1": "value1",
    "prop2": "value2",
    "prop3": "value3"
  }
}
{
  "2240002": {
    "title": "this is the product description for article 2240002",
    "prop1": "value1",
    "prop2": "value2",
    "prop3": "value3"
  }
}

所以我理想中想要的是正确转换上述内容。我在这里看到两个困难:

  1. 商品编号是“未知”键
  2. JSON结果似乎不是一个数组本身?

我能想到的最好的 jq 语法是:

{ "#namespaces": { "ns": "http://www.unknown.com/ccp/basit/service/article/api" } } + (keys[]| { articleId: ., insertCode: "62", calculatePrice: true, checkAvailability: true, findExclusions: true } | { articles: . }) | { "ns:inputArticleItemList": . }

但是,这无法从键中创建一个真正的数组并正确插入根/父元素。

结果如下:

{
  "ns:inputArticleItemList": {
    "#namespaces": {
      "ns": "http://www.unknown.com/ccp/basit/service/article/api"
    },
    "articles": {
      "articleId": "2201299",
      "insertCode": "62",
      "calculatePrice": true,
      "checkAvailability": true,
      "findExclusions": true
    }
  }
}
{
  "ns:inputArticleItemList": {
    "#namespaces": {
      "ns": "http://www.unknown.com/ccp/basit/service/article/api"
    },
    "articles": {
      "articleId": "2240002",
      "insertCode": "62",
      "calculatePrice": true,
      "checkAvailability": true,
      "findExclusions": true
    }
  }
}

这是要摆弄的 jqplay:https ://jqplay.org/s/4rGV-xU05p

标签: arraysjsonlistmergejq

解决方案


你正在寻找inputs.

使用命令行上的-n / --null-input选项,该程序会产生预期的输出。

{
  "ns:inputArticleItemList": {
    "#namespaces": {
      "ns": "http://www.unknown.com/ccp/basit/service/article/api"
    },
    "articles": [
      { 
        "articleID": (inputs | keys_unsorted[]),
        "insertCode": "62",
        "calculatePrice": true,
        "checkAvailability": true,
        "findExclusions": true
      }
    ]
  }
}

在线演示


推荐阅读