一部のJSONデータには数値が含まれています。すべての数値を文字列に変換するには? (引用符で囲む)
例:
{
"id":1,
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":1000,
"pndNumber":20000,
"zoneNumber":4
}
しなければならない
{
"id":"1",
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":"1000",
"pndNumber":"20000",
"zoneNumber":"4"
}
答え1
$ jq 'map_values(tostring)' file.json
{
"id": "1",
"customer": "user",
"plate": "BMT-216-A",
"country": "GB",
"amount": "1000",
"pndNumber": "20000",
"zoneNumber": "4"
}
新しいファイルにリダイレクトし、元のファイル名に移動します。
非フラット構造の数値を文字列により徹底的に変換するには、次の点を考慮してください。
jq '(..|select(type == "number")) |= tostring' file.json
その後、与えられた文書のすべての値を再帰的に確認し、番号を選択します。次に、選択した値を文字列に変換します。技術的にはキーもチェックしますが、JSONでは純粋な数字にすることはできないため、キーは選択されません。
例:
$ jq . file.json
{
"a": {
"b": 1
},
"b": null,
"c": [
1,
2,
"hello",
4
]
}
$ jq '(..|select(type == "number")) |= tostring' file.json
{
"a": {
"b": "1"
},
"b": null,
"c": [
"1",
"2",
"hello",
"4"
]
}
別途参照するには、次のようにnull
変更してください。select()
select(type == "number" or type == "null")
答え2
以下は、以下に基づいた簡単なソリューションです。jtc
UNIXユーティリティ:
bash $ jtc -w'<.*>D:' -eu echo '"{}"' \; file.json
{
"amount": "1000",
"country": "GB",
"customer": "user",
"id": "1",
"plate": "BMT-216-A",
"pndNumber": "20000",
"zoneNumber": "4"
}
bash $
変更をjsonファイルに直接適用するには、-f
次のようにスイッチを使用します。
bash $ jtc -f -w'<.*>D:' -eu echo '"{}"' \; file.json
提案されたソリューションは、次のように任意の構造化jsonでうまく機能します。
bash $ jtc -w'<.*>D:' -eu echo '"{}"' \; file.json
{
"amount": "1000",
"country": "GB",
"customer": "user",
"id": "1",
"plate": "BMT-216-A",
"pndNumber": "20000",
"sub": {
"subvalue": "123"
},
"zoneNumber": "4"
}
bash $
- null値を参照するには、徒歩パスを追加するだけです。
-w'<>n:'
- ブール追加歩行ルートを参照するには
-w'<any>b:'
また、反対の操作(すべての数字の逆参照)も同様の方法で簡単に実行できます。たとえば、file.json
「引用」を使用してすべての数字を逆参照します。
bash $ jtc -w'<^\d+$>R:' -eu echo {-} \; file.json
{
"amount": 1000,
"country": "GB",
"customer": "user",
"id": 1,
"plate": "BMT-216-A",
"pndNumber": 20000,
"zoneNumber": 4
}
bash $
修正する:最新バージョンでは、jtc
テンプレートと名前空間を実装します。これにより、外部シェルを呼び出す必要がなくなります。
bash $ jtc -w'<.*>D:' -u'<.*>D:<val>v' -T'"{val}"' file.json
{
"amount": "1000",
"country": "GB",
"customer": "user",
"id": "1",
"plate": "BMT-216-A",
"pndNumber": "20000",
"zoneNumber": "4"
}
jtc
ユーザーマニュアル:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md
答え3
perl -pe 's/("(?:\\.|[^"])*")|[^\s[\]{}:,"]+/$1||qq("$&")/ge' file.json
引用しないものと引用しないものは何でも引用します。[]{}:,whitespace
したがって、数字true
と。false
null
perl -pe 's/("(?:\\.|[^"])*")|-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?/$1||qq("$&")/ge'
json番号の仕様と一致し、引用符のない内容は具体的に引用されます。
近似ではなく、JSON仕様に従って正確にトークン化されます。
答え4
以下の方法を試してみましたが、本当に効果的です。
私はそれを減らすために私のレベルに達しようと2回パイプしました。
注文する:
sed 's/[0-9]\{1,\},\?$/"&/g' filename |
sed '/[0-9]\{1,\}$/s/[0-9]\{1,\}/&"/g'|
sed '/[0-9]\{1,\},$/s/,$/"&/g`'
出力:
{
"id":"1",
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":"1000",
"pndNumber":"20000",
"zoneNumber":"4"
}