properties
我在文件 Customer.json 中的键下有 json 映射,如下所示,
{
"customer": {
"properties": {
"customerId": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
我想将其转换为以下 withkey
和displayName
复制的 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。您必须决定如何从 到string
并String
进行额外的格式化。多线总是更容易调试(由您的问题证明的情况)和可维护,并给出更有意义的(行号)错误消息。
答案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
列表对象。每个都将具有键的值(即和),并且每个将具有子对象的值。key
value
key
properties
customerId
name
value
properties
给定一个这样的条目,提取该条目的key
值和值并将其插入到文本字符串模板中。您在字符串中看到的每个字符都是单引号字符。type
value
\u0027
给定您的示例输入文件,其输出将是
field(key: 'customerId', displayName: 'customerId', type: 'string')
field(key: 'name', displayName: 'name', type: 'string')