উদ্ধৃতি সহ জেএসএনে সমস্ত সংখ্যার মোড়ক


11

এখানে জেএসওএন ডেটা রয়েছে যাতে কিছু সংখ্যক মান রয়েছে। কীভাবে সমস্ত সংখ্যাকে স্ট্রিংয়ে রূপান্তর করবেন? (উদ্ধৃতি দিয়ে মোড়ানো)

উদাহরণ:

{
        "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" }
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস হ্যাঁ, এটি সাব-অবজেক্টগুলিকে স্ট্রিংয়ে পরিণত করবে। প্রদত্ত ডেটা স্ট্রাকচারটিতে উপ-অবজেক্টগুলি নেই।
কুসালানন্দ

2
কেবল উপ-অবজেক্টসই নয়, অ্যারে, বুলিয়ান এবং সমস্ত আইপিও'র ওপির nullনমুনার কোনওটি না থাকলেও আইএমও লক্ষণীয়)
স্টাফেন চেজেলাস

এবং আমার যদি অ্যারে থাকে তবে এটি কীভাবে পরিবর্তন করব?
ভি কে

@ স্টাফেনচাজেলা সাজানো হয়েছে। আমার দিকে তাকানোর জন্য ধন্যবাদ
কুসালানন্দ

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 $ 

আপনি যদি সরাসরি জসন ফাইলে পরিবর্তনগুলি প্রয়োগ করতে চান তবে -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 স্পেসিফিকেশনের উপর ভিত্তি করে সঠিক টোকেনাইজিং করে, এটি কোনও আনুমানিক নয়।


-1

আমি নীচের পদ্ধতিটি দিয়ে চেষ্টা করেছি এবং এটি ভাল কাজ করেছে।

এটি হ্রাস করার জন্য আমি আমার স্তরে 2 বার পাইপলাইন দিয়েছি

COMMAND:

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 ... এর মতো সংখ্যার জন্য কাজ করবে না
ফুচলভি

@ ফুকলভ \{1,\}ইআর এর বিআরই সমতুল্য +। কিছু sedবাস্তবায়ন EREs সক্ষম করার জন্য \+একটি এক্সটেনশন বা একটি -Eবা -rবিকল্প হিসাবে সমর্থন করে তবে এটি পোর্টেবল নয়। \?এটি অন্য অ-বহনযোগ্য এক্সটেনশান যদিও এর মান সমতুল্য\{0,1\}
স্টাফেন চ্যাজেলাস

@ ফুকলভ আপনি একটি বৈধ জেএসওএন ফাইলে অবিকৃত 0xab 0o12 0b1011 নম্বর পাবেন না।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.