কেন হেরডোক থেকে জেএসওএন সামগ্রীটি পার্সেবল নয়?


11

আমার একটি জেএসএন খণ্ড রয়েছে।

নিম্নলিখিতগুলি কাজ করে না:

VALUE=<<PERSON
{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com"  
}
PERSON
echo -n "$VALUE" | python -m json.tool

ফলাফল হলো:

কোনও JSON অবজেক্ট ডিকোড করা যায়নি

একই সঙ্গে করছেন jq, অর্থাত্

echo -n "$VALUE" | jq '.'

কোনও আউটপুট নেই।

নিম্নলিখিতগুলির জন্য একই আচরণ রয়েছে:

VALUE=<<PERSON
'{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com"  
}'
PERSON
echo -n "$VALUE" | python -m json.tool

প্রতিক্রিয়া:

কোনও JSON অবজেক্ট ডিকোড করা যায়নি

কিন্তু নিম্নলিখিত কাজ করে:

VALUE='{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool

5
আমি জানি না বাশ কী করছে, তবে আপনার প্রথম দুটিতে ইমেল স্ট্রিংয়ের পরে একটি পেছনের কমা রয়েছে তবে তৃতীয় স্থানে নেই, যা প্রথম দম্পতিটিকে অবৈধ জেএসএন তৈরি করবে
নিক টি

@ নিকটি আপনার এই উত্তরটি তৈরি করা উচিত কারণ আমি মনে করি যে সমস্যাটি হ'ল সমস্যা।
rrauenza

যদি এটির (একমাত্র) উত্তর হয় তবে এটি সম্ভবত "পুনরুত্পাদন করা যায় না (টাইপো)" হিসাবে বন্ধ করা উচিত। যাইহোক, দেখে মনে হচ্ছে কুসার এবং টেরডনের উত্তরে উল্লেখ করা হয়েছে + অ্যাসাইনমেন্ট + রিডাইরেকশনটি সম্পূর্ণরূপে নষ্ট হয়ে গেছে যাতে আপনি একটি খালি স্ট্রিং পান, সুতরাং দুটি সমস্যা রয়েছে, উভয়ই একই "নো জেএসএন ..." ত্রুটি দেয়। মাঝখানে আপনার অনুমানগুলি যাচাই করে সমস্যার দ্বিখণ্ডিত করা খুব ভাল অনুশীলন: একটি সহজ echo $VALUEছাড়া ... | jqতথ্যবহুল হবে।
নিক টি

@ নিকট: এটি একটি অনুলিপি / পেস্ট ইস্যু ছিল। বিভ্রান্তির জন্য দুঃখিত
জিম

উত্তর:


19
VALUE=<<PERSON
some data
PERSON

echo "$VALUE"

আউটপুট নেই।

একটি এখানে-নথি একটি পুনঃনির্দেশ , আপনি একটি পরিবর্তনশীল মধ্যে পুনঃনির্দেশ করতে পারবেন না।

কমান্ড লাইনটি বিশ্লেষণ করা হলে, পরিবর্তনশীল অ্যাসাইনমেন্ট থেকে পৃথক পদক্ষেপে পুনঃনির্দেশগুলি পরিচালনা করা হয়। আপনার আদেশটি সমান (স্থান নোট করুন)

VALUE= <<PERSON
some data
PERSON

এটি আপনার ভেরিয়েবলকে একটি খালি স্ট্রিং বরাদ্দ করে, তারপরে স্ট্রিং থেকে স্ট্যান্ডার্ড ইনপুটটি কমান্ডে পুনঃনির্দেশ করে (তবে কোনও আদেশ নেই, তাই কিছুই ঘটে না)।

মনে রাখবেন যে

<<PERSON
some data
PERSON

বৈধ, যেমন আছে

<somefile

এটি ঠিক যে কোনও কমান্ড নেই যার স্ট্যান্ডার্ড ইনপুট স্ট্রিমটি ডেটা রাখতে সেট করা যেতে পারে, তাই এটি সবেমাত্র হারিয়ে গেছে।

এটি যদিও কাজ করবে:

VALUE=$(cat <<PERSON
some data
PERSON
)

এখানে, এখানে-নথিটি প্রাপ্ত কমান্ডটি হ'ল catএটি এটির স্ট্যান্ডার্ড আউটপুটে এটি অনুলিপি করে। এটি তখন কমান্ড প্রতিস্থাপনের মাধ্যমে ভেরিয়েবলকে বরাদ্দ করা হয়।

আপনার ক্ষেত্রে, আপনি পরিবর্তে এটি ব্যবহার করতে পারেন

python -m json.tool <<END_JSON
JSON data here
END_JSON

কোনও ভেরিয়েবলে ডেটা সংরক্ষণের অতিরিক্ত পদক্ষেপ না নিয়ে।


2
আপনি ঠিক PERSON="পরে একটি নিউলাইন এবং মাল্টি-লাইন ডেটা অনুসরণ করতে পারেন , তারপরে আরেকটি "
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

1
@ আর .. হ্যাঁ, তবে একটি এখানে-নথি আপনাকে শেলের উদ্ধৃতি বিধিগুলিকে বাইপাস করতে দেয়। তাই প্রায়শই মাল্টি-লাইন ডেটার জন্য উদ্ধৃত স্ট্রিংয়ের পরিবর্তে এখানে-নথি ব্যবহার করা নিরাপদ, বিশেষত যদি ডেটাতে একক বা ডাবল উদ্ধৃতি (বা উভয়) থাকে।
কুসালানন্দ

2
@ আর .. এটি দেওয়া JSON দেওয়া সম্পর্কে আমরা কথা বলছি, প্রতিটি সম্পত্তির নামের দ্বিগুণ উদ্ধৃতিগুলি এড়ানোর জন্য একক উদ্ধৃতি ব্যবহার করা ভাল be PERSON='। এটি যদি না হয় ওপি পরে ভেরিয়েবলগুলি ইন্টারপোল্ট করতে না চায়।
JoL

(ব্যাকস্ল্যাশ) (নিউলাইন) এখানে একটি নথিতে নষ্ট হয়ে গেছে বলে মনে হচ্ছে, আপনি যদি ডিলিমেটার শব্দটি উদ্ধৃত / অব্যাহত রাখেন। এটি পছন্দসই হতে পারে, তবে এটি অক্ষম করার কোনও উপায় আছে কি?
স্কট 18

@ স্কট যদি এই সাইটে আগে এই প্রশ্নটি না জিজ্ঞাসা করা হয়, তবে এটি তার নিজের পক্ষে একটি দুর্দান্ত প্রশ্ন হবে।
কুসালানন্দ

11

কারণ ভেরিয়েবলটি আপনার বংশগত দ্বারা সেট করা হয়নি:

$ VALUE=<<PERSON  
> {    
>   "type": "account",  
>   "customer_id": "1234",  
>   "customer_email": "jim@gmail.com",  
> }  
> PERSON
$ echo "$VALUE" 

$

আপনি যদি কোনও ভেরিয়েবলের মান নির্ধারণ করতে একটি হেরডোক ব্যবহার করতে চান তবে আপনার এমন কিছু দরকার:

$ read -d '' -r VALUE <<PERSON  
{    
  "type": "account",  
  "customer_id": "1234",  
  "customer_email": "jim@gmail.com",  
}   
PERSON

1
আপনি কেন একক উদ্ধৃতিতে JSON ডেটা মোড়ানো করছেন? এটি সত্যিকারের মতো দেখাচ্ছে না যেমন ওপি চায় যে তারা তার ইনপুট স্ট্রিংয়ের অংশ হোক। এ ছাড়া, গৃহহীন বিড়ালের জনসংখ্যা হ্রাস করার জন্য +1। কুসালানন্দের উত্তর হিসাবে, আপনি লাইনগুলির শেষ প্রান্তে ইনপুট এবং ব্যাকস্ল্যাশগুলিতে << \PERSONরক্ষা করার পরামর্শ দিতে চাইতে পারেন $
স্কট 18

@ স্কট উম, কারণ আমি অন্ধভাবে ওপি থেকে পাঠ্যটি অনুলিপি করেছি। ধন্যবাদ
টেরডন

3
এটি সঠিক উত্তর। $(cat <<EOF ... EOF)একটি অদ্ভুত নির্মাণ: একটি সাবশেল চালানো এবং তারপরে বিড়ালের কাছে হেরডোক প্রেরণ করা ঠিক এটি এটি STDOUT এ প্রেরণ করে এবং তারপরে এই সাবশেলের ফলাফলটি একটি ভেরিয়েবলের জন্য নির্ধারণ করে? আমি আশা করি লোকেরা তাদের চিন্তাভাবনা প্রক্রিয়াগুলি সম্পর্কে কী বলছে সে সম্পর্কে চিন্তাভাবনা করবে। readতুলনা করে ভেরিয়েবলের মাধ্যমে হেরডোক বরাদ্দ করা বুদ্ধিমান।
ধনী

আমি এটি বলব না $(cat << EOF... (ডেটা)… EOF )অদ্ভুত। এটি বিশ্রী এবং সংশ্লেষিত, তবে তাই read -d … << EOF - বিশেষত read -d '' << EOF । আমি টার্ডনের উত্তরটির প্রশংসা করি কারণ এতে কেবল বিল্টিন ব্যবহার করা হয়, কোনও প্রোগ্রাম নেই। কিন্তু, সবচেয়ে গুরুত্বপূর্ণভাবে, $(cat << EOF... (তথ্য) ... EOF )ব্যর্থ হয় কোন লাইন দিয়ে শেষ করে \(ব্যাকস্ল্যাশ) - অধীনে মন্তব্য দেখতে Kusalananda এর উত্তর
স্কট

5

এটি কারণ আপনি জেএসএন-এর সাথে ব্যবহারের জন্য এখানে-ডকটিকে যেভাবে সংজ্ঞায়িত করেছেন তা ভুল। আপনি এটি হিসাবে ব্যবহার করা প্রয়োজন

VALUE=$(cat <<EOF
{  
  "type": "account",  
  "customer_id": "1234",  
  "customer_email": "jim@gmail.com",  
}
EOF
)

এবং করার printf "$VALUE"ফলে প্রত্যাশা অনুযায়ী JSON ডাম্প করা উচিত।


3

বংশগত এবং ভেরিয়েবলগুলি ভালভাবে মিশে না বা কমপক্ষে এইভাবে নয় not অপরপক্ষে তুমি…

কোনও অ্যাপ্লিকেশনটির স্ট্যান্ডার্ড ইনপুট হিসাবে উত্তরাধিকার পাস করুন Pass

python -m json.tool <<PERSON  
{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com",
}
PERSON

বা ...

শেল ভেরিয়েবলে মাল্টি-লাইন পাঠ্য সংরক্ষণ করুন

VALUE='{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com",
}'

অভ্যন্তরীণ ডাবল উক্তিগুলি এড়ানোর প্রয়োজন এড়াতে আমি একক উদ্ধৃতি ব্যবহার করেছি। অবশ্যই আপনি ডাবল উদ্ধৃতিও ব্যবহার করতে পারেন, যেমন আপনার যদি প্যারামিটারগুলি প্রসারিত করতে হয়:

VALUE="{
  \"type\": \"account\",
  \"customer_id\": ${ID},
  \"customer_email\": \"${EMAIL}\",
}"

তারপরে আপনি ভেরিয়েবল মানটি পরে ব্যবহার করতে পারেন।

echo -n "$VALUE" | python -m json.tool
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.