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


11

数値を含む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"
}

回答:


29
$ 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")

3
注それが変化すること{"a":{"b":1},"b":null}{ "a": "{\"b\":1}", "b": "null" }
ステファンChazelas

@StéphaneChazelasはい、サブオブジェクトを文字列に変換します。ただし、指定されたデータ構造にはサブオブジェクトが含まれていません。
クサラナンダ

2
サブオブジェクトだけでなく、配列、ブール値などを含むすべての値null(OPのサンプルにそれらがない場合でも、IMOに注目する価値はあります)。
ステファンChazelas

配列がある場合、これをどのように変更しますか?
VK

@StéphaneChazelas並べ替え。私をつついてくれてありがとう。
クサラナンダ

8

これは、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


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

引用符で囲まれていないとではありません何かを引用するだろう[]{}:,whitespace、そう数字を引用うtruefalsenull

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

json番号の仕様に一致するものを具体的に引用しますが、それはまだ引用符の中にありません。

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


-1

以下の方法で試しましたが、うまくいきました。

私はそれを減らすために自分のレベルまで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"
}

@Kusalanandaがコードを修正
Praveen Kumar BS

なぜ使うの\{1,\},?要素を1回以上の使用を表示するかどうかをテストします+。そして、これは-123、0xab、0o12、0b1011、1e23、または1.2e3 ...のような数値では機能しません...
phuclv

@phuclv \{1,\}は、EREに相当するBRE +です。いくつかのsed実装がサポートする\+拡張機能またはとして、-Eまたは-rのEREを有効にするオプションが、それはポータブルではありません。\?その標準と同等であるものの、他の非ポータブル拡張である\{0,1\}
ステファンChazelas

@phuclv有効なJSONファイルで、引用符で囲まれていない0xab 0o12 0b1011番号が見つかりません。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.