web-dev-qa-db-ja.com

すべての数値をJSONで引用符で囲みます

数値を含む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"
}
11
V-K
_$ 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")
_
29
Kusalananda

これはjtcUNIXユーティリティに基づく簡単な解決策です:

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値を引用する場合は、walk-path -w'<>n:'
  • ブール値を引用したい場合は、walk-path -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

8
Dmitry
Perl -pe 's/("(?:\\.|[^"])*")|[^\s[\]{}:,"]+/$1||qq("$&")/ge' file.json

引用されておらず、[]{}:,whitespaceでもないものはすべて引用するため、数字truefalseおよびnullを引用します。

Perl -pe 's/("(?:\\.|[^"])*")|-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?/$1||qq("$&")/ge'

Json番号の仕様に一致するものを具体的に引用しますが、まだ引用符で囲まれていません。

これらはJSON仕様に基づいて正確なトークン化を行います。これは概算ではありません。

4