使用jq格式化DynamoDB的JSON数据

时间:2018-01-18 17:23:59

标签: json amazon-dynamodb jq

尝试在shell中将json对象格式化为适当的DynamoDB格式

{ "200": 1728, "201": 288, "301": 214, "401": 104, "404": 12 }

我最初有一个脚本,我认为是正确的格式,但检索的数据是动态的,因为它可以有任意数量的键

jq -r '.codes' item.json | jq --slurp '{Codes:{M: .[]}}'

输出

{"Codes": {"M": { "200": 1728, "201": 288, "301": 214, "401": 104, "404": 12 }}}

DynamoDB格式,一个静态的字段是" N",但是数字必须格式化为字符串,我可以在初始过滤器中做到这一点

{"Codes": {"M": { "200": {"N": "1728"}, "201": {"N": "288"}, "301": {"N": "214"}, "401": {"N": 104}, "404": {"N": "12"} }}}

我花了4天的时间尝试获取到目前为止所获得的内容,并且因为格式正确而陷入困境

1 个答案:

答案 0 :(得分:1)

正如我所理解的那样,你所缺少的谜题是能够将JSON对象{key1:value1,key2:value2,...}转换为以下形式的对象:{key1 :{" N":(value1 | tostring)},...

这可以使用过滤器完成:

to_entries | map( {(.key): {N: (.value|tostring)}} ) | add;

将此功能包装到命名函数中可能是值得的:

def package: to_entries | map( {(.key): {N: (.value|tostring)}} ) | add;

然后可以写出问题的解决方案(据我所知):

{Codes: {M: package}}

输入:

{ "200": 1728, "201": 288, "301": 214, "401": 104, "404": 12 }

输出:

{
  "Codes": {
    "M": {
      "200": {
        "N": "1728"
      },
      "201": {
        "N": "288"
      },
      "301": {
        "N": "214"
      },
      "401": {
        "N": "104"
      },
      "404": {
        "N": "12"
      }
    }
  }
}