使用 bash 脚本将 json 映射对象转换为托管 csv 行

使用 bash 脚本将 json 映射对象转换为托管 csv 行

properties我在文件 Customer.json 中的键下有 json 映射,如下所示,

{
    "customer": {
        "properties": {
            "customerId": {
                "type": "string",
                "index": "not_analyzed"
            },
            "name": {
                "type": "string",
                "index": "not_analyzed"
            }
        }
    }
}

我想将其转换为以下 withkeydisplayName复制的 andtype来自上面的映射,

field(key: 'customerId',     displayName: 'customerId', type: 'String')
field(key: 'name',           displayName: 'name',       type: 'String')

我打并尝试过bash + 蟒蛇如下假设它首先获取客户密钥并在属性内循环,

$ cat Customer.json | python -c 'import sys; import simplejson as json; \
print "\n".join( [i["properties"] for i in json.loads( sys.stdin.read() )["customer"]] )'

Traceback (most recent call last):
File "<string>", line 2, in <module>
TypeError: string indices must be integers, not str

我也愿意接受其他解决方案。

答案1

解析此类结构化数据最好使用专用解析器来完成,就像您所做的那样。但是,在这种特殊情况下,您可以执行以下操作:

$ grep -B 1 '"type":' Customer.json | tr $'"' $"'" | sed 's/[:,]//g' | 
    awk '{print "field(key: "$1",\tdisplayName: "$1",\t type: "$NF")"}' RS="--" 

返回:

field(key: 'customerId',    displayName: 'customerId',   type: 'string')
field(key: 'name',  displayName: 'name',     type: 'string')

答案2

这个错误对我来说似乎很清楚,变量“i”是一个字符串,因为循环for迭代“customer”字典/映射的值。该值是一个字典/映射本身,迭代它将使您获得键列表的继承(即[“properties”]。

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( [i for i in json.loads( sys.stdin.read() )["customer"]["properties"] ] )'

会给你

 customerid
 name

以下应该会让您更接近您的目标:

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( ["{} {}".format(k, v) for k,v in json.loads( sys.stdin.read() )["customer"]["properties"].iteritems() ] )'

这使:

customerId {'index': 'not_analyzed', 'type': 'string'}
name {'index': 'not_analyzed', 'type': 'string'}

从那里我建议你在脚本中实际创建 python。您必须决定如何从 到stringString进行额外的格式化。多线总是更容易调试(由您的问题证明的情况)和可维护,并给出更有意义的(行号)错误消息。

答案3

jq

jq -r '.customer.properties | to_entries[] | 
    "field(key: \u0027\(.key)\u0027, displayName: \u0027\(.key)\u0027, type: \u0027\(.value.type)\u0027)"' Customer.json

这会将值转换为带有键和 的properties列表对象。每个都将具有键的值(即和),并且每个将具有子对象的值。keyvaluekeypropertiescustomerIdnamevalueproperties

给定一个这样的条目,提取该条目的key值和值并将其插入到文本字符串模板中。您在字符串中看到的每个字符都是单引号字符。typevalue\u0027

给定您的示例输入文件,其输出将是

field(key: 'customerId', displayName: 'customerId', type: 'string')
field(key: 'name', displayName: 'name', type: 'string')

相关内容