数値を含む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"
}
_$ 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")
_
これは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 $
-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 $
[〜#〜] update [〜#〜]: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
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仕様に基づいて正確なトークン化を行います。これは概算ではありません。