এম্বেড থাকা (উদ্ধৃত) জসন স্ট্রিংটিকে জসন-এ কীভাবে রূপান্তর করবেন


22

আমি জেসনকে পার্স করার জন্য "জেকিউ" এর সাথে পরিচিত।

আমি এমন একটি পরিষেবা নিয়ে কাজ করি যা একটি জসন প্রতিক্রিয়া তৈরি করে যেখানে বৈশিষ্ট্যগুলির মধ্যে একটি নিজেই একটি জসন স্ট্রিং। আমি কীভাবে সেই উদ্ধৃত মানটিকে একটি বৈধ জসন স্ট্রিংয়ে রূপান্তর করব যাতে আমি এরপরে JQ দিয়ে প্রক্রিয়া করতে পারি?

উদাহরণস্বরূপ, আমি যদি কেবল "জিকিউ" থেকে সমতল সুন্দর প্রিন্টেড জসনটি দেখি তবে আউটপুটটির একটি সংক্ষিপ্ত অংশ এখানে দেওয়া হয়েছে:

"someJsonString": "{\"date\":\"2018-01-08\", ...

আমি সেই সম্পত্তিটির মান পেতে jq ব্যবহার করতে পারি, তবে উদ্ধৃত স্ট্রিংটি "আনসকেপিং" করে বৈধ জসনকে রূপান্তর করতে হবে।

আমি মনে করি যে আমি এটিকে সিডে পাইপ করতে পেরে, ডাবল উদ্ধৃতিটি খোলার এবং শেষ করে এবং সমস্ত ব্যাকস্ল্যাশগুলি (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'") মুছে ফেলতে পারি । এটি কাজ করে বলে মনে হচ্ছে তবে এটি সবচেয়ে শক্তিশালী সমাধানের মতো বলে মনে হচ্ছে না।

আপডেট :

আমি যা করছি সে সম্পর্কে একটু পরিষ্কার হওয়ার জন্য, আমি এখানে কয়েকটি পরীক্ষামূলক নমুনা দেখিয়েছি যা আমি চেষ্টা করেছি যা দেখায়:

% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...

আপডেট :

এখানে সম্পূর্ণরূপে একক উদাহরণ:

% cat stuff.json | jq .
{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"

আপডেট :

আমি যদি সত্যিকারের জকিউ এক্সপ্রেশন দিয়ে সেই শেষ আউটপুটটি প্রক্রিয়া করার চেষ্টা করি তবে এটি এমন কিছু করে:

% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)

আপনি যদি স্ট্রিং প্রোপার্টিটির কেবলমাত্র মান jqপেতে ব্যবহার করেন তবে এটি কী অপরিবর্তিত রয়েছে? যদি তা হয় তবে কেবল এটি একটি তাজাতে পাইপ করুন । jq
ডোপঘোটি

না, এটি অবিচ্ছিন্নভাবে ফেরত দেয় না। এটাই আসল কথা.
ডেভিড এম কারার

কীভাবে echo $(jq statement here)?
ডোপঘোটি

নাহ, কোনও পরিবর্তন নেই।
ডেভিড এম কারার

@ ডেভিডএম.কায়ার, ঠিক আছে, সম্ভব হলে - সত্যিকারের গুরুত্বপূর্ণ স্ট্রিং এবং চূড়ান্ত ফলাফলের সাথে আপনার ইনপুটটি প্রসারিত করুন
রোমানপেরেখারেস্ট

উত্তর:


20

এই জন্য একটি rawপতাকা আছে

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

আউটপুট

{"date":"2018-01-08"}

পার্থক্যটি হ'ল রোমানের উত্তরের সাথে আপনাকে বৈধ জেএসএন আউটপুট, বা বৈধ জেএসওন না হলে ত্রুটি বার্তাগুলি পাওয়ার গ্যারান্টিযুক্ত।
কুসালানন্দ

বৈধ পয়েন্ট, তবে এটি যদি অটোমেশনে ব্যবহৃত হয় তবে আমার মনে হয় হঠাৎ বৈধ জেসন আউটপুট না পাওয়া অস্বাভাবিক হবে। সর্বাধিক সুবিধাজনক ফর্মটি প্রায় সমস্ত সময় পুরোপুরি ঠিক থাকবে। তবে আরও সুনির্দিষ্ট পদ্ধতি সম্পর্কে জানা এখনও ভাল।
ডেভিড এম কারার

@ ডেভিডএম.কায়ার "হঠাৎ বৈধ জেএসন আউটপুট না পেয়ে অস্বাভাবিক" এইচএ! Riiiight। অটোমেশনে পরিচালনায় ত্রুটি? ত্রুটি কখনই ঘটবে না ! কেন বিরক্ত হও!
ব্রুনো ব্রোনোস্কি

এর jqজন্য আরও জেএসএন প্রসেসিংয়ের জন্য অন্যের কাছে পাইপিং প্রয়োজন , অন্যদিকে রোমের পদ্ধতির সাহায্যে আপনি একই jqঅভিব্যক্তিটি চালিয়ে যেতে পারেন ।
রমন

1
@ ক্রিকেট_০০7: এটি জেকু ১.৫ দিয়ে চেষ্টা করেছেন এবং নিশ্চিত করেছেন যে এটি কার্যকর হয় না: jq -rc '.stuff.date'উত্পাদন করে jq: error (at <stdin>:0): Cannot index string with string "date"। তবে: ভাল .stuff | fromjson | .dateকাজ করে।
রমন

26

সঙ্গে jq'র fromjsonফাংশন:

নমুনা stuff.jsonসামগ্রী:

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}

jq -c '.stuff | fromjson' stuff.json

আউটপুট:

{"date":"2018-01-08"}

এটা অদ্ভুত বলে মনে হচ্ছে। বিকল্প উত্তর সরবরাহ করা হয়েছে
ক্রিকেট_007
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.