properties
以下のように、Customer.jsonファイルのキーの下にjsonマッピングがあります。
{
"customer": {
"properties": {
"customerId": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
上記のマッピングを使用key
してdisplayName
コピーし、次のように変換したいと思います。type
field(key: 'customerId', displayName: 'customerId', type: 'String')
field(key: 'name', displayName: 'name', type: 'String')
試してみました。バッシュ+ Python次のように、まずクライアントキーを取得し、プロパティ内でループを繰り返すとします。
$ 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
for
エラーは私にはっきりしているようです。ループが「顧客」辞書/マップの値を繰り返すため、変数「i」は文字列です。値は辞書/マップ自体であり、これを繰り返すとキーリスト([[プロパティ]]など)が継承されます。
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')