bashスクリプトを使用してjsonマップオブジェクトをマネージドcsv行に変換する

bashスクリプトを使用してjsonマップオブジェクトをマネージドcsv行に変換する

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キーと 。それぞれはキー値(つまり合計)を持ち、それぞれは子オブジェクトの値を持ちます。keyvaluekeypropertiescustomerIdnamevalueproperties

これらの項目がある場合は、その項目のkey値と値を抽出してテキスト文字列テンプレートに挿入します。文字列に表示されるすべての文字は一重引用符文字です。typevalue\u0027

例 入力ファイルが与えられると、出力は次のようになります。

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

関連情報