আমি কীভাবে জিকিউ ব্যবহার করে একটি জসন নথিতে একক মান আপডেট করব?


110

আমি যদি খুব সুস্পষ্ট কিছু উপেক্ষা করে থাকি; আমি সবেমাত্র পেয়েছি jqএবং পার্শ্ববর্তী ডেটাগুলিকে প্রভাবিত না করে একটি জেএসএন মান আপডেট করার জন্য এটি ব্যবহার করার চেষ্টা করছি।

আমি কোনও curlফলাফলটি পাইপ করতে jq, একটি মান আপডেট করতে এবং আপডেট হওয়া জেএসএনকে একটি তে পাইপ করতে চাই curl -X PUT। কিছুটা এইরকম

curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json

এখনও অবধি আমি এটি ব্যবহার করে একসাথে হ্যাক করেছি sed, তবে |=অপারেটরের কয়েকটি উদাহরণ দেখার পরে jqআমি নিশ্চিত যে আমার এগুলির দরকার নেই।

এখানে একটি জেএসওএন নমুনা রয়েছে - বাকি জেএসওন সংরক্ষণ করার সময় আমি কীভাবে jqসেট করতে ব্যবহার করব "local": false?

{
  "shipping": {
    "local": true,
    "us": true,
    "us_rate": {
      "amount": "0.00",
      "currency": "USD",
      "symbol": "$"
    }
  }
}

উত্তর:


131

আপনি =অপারেটরটি ব্যবহার করে কোনও সামগ্রীর মান নির্ধারণ করেন । |=অন্যদিকে একটি মান আপডেট করতে ব্যবহৃত হয়। এটি একটি সূক্ষ্ম তবে গুরুত্বপূর্ণ পার্থক্য। ফিল্টারগুলির প্রসঙ্গে পরিবর্তন ঘটে।

যেহেতু আপনি একটি ধ্রুবক মান হিসাবে সম্পত্তি সেট করছেন, =অপারেটরটি ব্যবহার করুন ।

.shipping.local = false

কেবলমাত্র নোট করুন যে কোনও সম্পত্তির মান নির্ধারণের সময় এটির অস্তিত্বের প্রয়োজন নেই। আপনি সহজেই নতুন মানগুলি যুক্ত করতে পারেন।

.shipping.local = false | .shipping.canada = false | .shipping.mexico = true

10
এই নমুনাটি স্বাভাবিক মানের জন্য ভাল নয়। সুতরাং আপনার যদি স্বাভাবিক মান পরিবর্তন করতে হয় তবে আপনার "এটি যুক্ত করতে হবে, যেমন .shipping.local = "new place"। সুতরাং পুরো কমান্ড হবে curl http://example.com/shipping.json | jq '.shipping.local = "new place"'। অন্যথায়, আপনি অদ্ভুত ত্রুটি পাবেন।
BMW

9
@ বিএমডাব্লু কি? এখানে পুরোপুরি ঠিক আছে। কোনও বৈধ জেএসন মান বৈধ, এটি কেবল আক্ষরিক হতে পারে false। মানগুলির স্ট্রিং হতে হবে না।
জেফ মার্কাডো

@ বিএমডাব্লু ওপি এটি সেট করতে চায় false। কোনো সমস্যা?
সফটওয়্যার

.shipping.<INSERT VAR HERE>যেখানে জেআর-তে সংজ্ঞা দেওয়া হয়েছে সেখানে আপনি কীভাবে সেট করবেন? একটি সাধারণ উদাহরণের জন্য, আপনি কীভাবে jq --arg location local '.shipping.$location = false'এটিকে কাজ করতে পরিবর্তন করবেন?
ম্যাক্স মার্ফি

4
@ ম্যাক্সমারফি:.shipping[$location] = false
জেফ

21

একটি মান আপডেট করুন (.foo.bar "" নতুন মান "সেট করে):

jq '.foo.bar = "new value"' file.json

একটি ভেরিয়েবল ব্যবহার করে একটি মান আপডেট করুন ("হ্যালো" তে .foo.bar সেট করে):

variable="hello"; jq --arg variable "$variable" '.foo.bar = $variable' file.json

আমি এটিকে শেলের মাধ্যমে একটি এনপিএম প্যাকেজ.জসনের নামকরণ করতে উদাহরণ হিসাবে ব্যবহার করেছি এবং এটি 100% কাজ করেছে, ধন্যবাদ
মাচাডো

4
এটি আসলে ফাইলের বিষয়বস্তুগুলিকে প্রতিস্থাপন করে না। এটি কেবল স্টডআউট প্রিন্ট করে। পরিবর্তন অবিচ্ছিন্ন করতে আপনার ফাইলটিতে স্টাউট সংরক্ষণ করতে হবে। দেখুন stackoverflow.com/a/60744617/1626687
spuder

3

অপারেটরের সাথে একটি অনুরূপ ফাংশন | = মানচিত্র। অ্যারের জন্য পূর্ববর্তী ফিল্টারের প্রয়োজনীয়তা এড়াতে মানচিত্রটি উপযুক্ত হবে ...

ধারণা করুন যে আপনার ডেটা একটি অ্যারে (এই উদাহরণের জন্য খুব সাধারণ)

[
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  },
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  }
]

সুতরাং কোডে অ্যারেটি বিবেচনা করা প্রয়োজন:

http://example.com/shipping.json | jq '.[] | .shipping.local = "new place"' | curl -X PUT http://example.com/shipping.json

বা প্রতিটি অ্যারে উপাদান হিসাবে কাজ করার জন্য তৈরি করা মানচিত্রের ফাংশনটি ব্যবহার করতে

http://example.com/shipping.json | jq 'map(.shipping.local = "new place")' | curl -X PUT http://example.com/shipping.json

পর্যবেক্ষণ

যারা শিখছে তাদের পক্ষে, আপনি জেকিউ ব্যবহারের ক্ষেত্রেও কিছু ভুল করেছিলেন, কেবল বিবেচনা করুন যে এটি প্রোগ্রাম হিসাবে 1 ম পরামিতিটি "পড়া" করে না, সুতরাং সমস্ত কাঙ্ক্ষিত কমান্ডগুলি প্রথম কলটিতে কল করার পরে প্রথম স্ট্রিংয়ে অন্তর্ভুক্ত করা হবে কার্যক্রম.


এটি কেন প্রয়োজনীয়ভাবে আলাদা .[].shipping.local = "new place"?
রোয়াইমা

4
এই ক্ষেত্রে পার্থক্যটি, প্রতিক্রিয়াটি হ'ল মানচিত্রের ফাংশনটি ব্যবহার করে অবজেক্টগুলির একটি অ্যারে দেওয়া হবে, অন্য বিকল্পের ক্ষেত্রে আপনি প্রতি লাইনে একটি অবজেক্টের ক্রম করবেন (ব্যাশ হিসাবে অন্যান্য
অনুবাদকদের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.