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

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"
}

答え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

以下は、以下に基づいた簡単なソリューションです。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値を参照するには、徒歩パスを追加するだけです。-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と。falsenull

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"
}

関連情報