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" }
स्टीफन चेज़लस

@ स्टीफनचेज़ेलस हाँ, यह उप-वस्तुओं को तार में बदल देगा। दी गई डेटा संरचना में हालांकि उप-ऑब्जेक्ट नहीं होते हैं।
Kusalananda

2
केवल उप-ऑब्जेक्ट ही नहीं, सरणियों, बूलियन और null(ओपी के नमूने में से कोई भी नहीं है, भले ही आईएमओ ध्यान देने योग्य है) सहित सभी मूल्य ।
स्टीफन चेज़लस

और अगर मेरे पास एक सरणी है, तो इसे कैसे बदला जाए?
वीके

@ स्टीफनचेलजेलस क्रमबद्ध। मुझ पर प्रहार करने के लिए धन्यवाद।
Kusalananda

8

यहाँ jtcयूनिक्स उपयोगिता पर आधारित एक आसान समाधान है :

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

प्रस्तावित समाधान एक मनमाने ढंग से संरचित जोंस के साथ सही ढंग से काम करेगा, जैसे:

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 $ 

अद्यतन : 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, इसलिए संख्याओं को उद्धृत करेगा true, falseऔर null

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

@ कुसलानंद ने कोड को सही किया
प्रवीण कुमार बीएस

आप उपयोग क्यों करते हैं \{1,\},? यह जांचने के लिए कि कोई तत्व एक या अधिक बार उपयोग में आता है या नहीं +। और यह -123, 0xab, 0o12, 0b1011, 1e23 या 1.2e3 जैसे नंबरों के लिए काम नहीं करेगा ...
phuclv

@ एफ्यूक्लेव ईआरई के \{1,\}बराबर है +। कुछ sedकार्यान्वयन का समर्थन \+एक विस्तार या एक के रूप में -Eया -rविकल्प eres सक्षम करने के लिए, लेकिन यह पोर्टेबल नहीं है। \?एक और गैर-पोर्टेबल विस्तार है, जिसका मानक समतुल्य है\{0,1\}
स्टीफन चेज़लस

@phuclv आपको एक मान्य JSON फ़ाइल में 0xab 0o12 0b1011 संख्याएँ नहीं मिलीं।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.