কীভাবে JSON ফাইল থেকে ডেটা বের করতে হয়


13

আমি আমার প্রশ্নের সমাধানের জন্য বিন অনুসন্ধান করেছি কিন্তু এর চেয়ে ভাল বা খুঁজে পাইনি যে আমি যা পেয়েছি তা পেয়েছি না। সুতরাং আমার সমস্যাটি কী তা নিয়ে কথা বলা যাক। আমি একটি রাস্পবেরি পাইতে একটি স্মার্ট হোম কন্ট্রোল সফটওয়্যার ব্যবহার করছি এবং আমি এই উইকএন্ডে পাইলাইট-রিসিভ ব্যবহার করে জানতে পারি যে আমি আমার আউটডোর টেম্পারেচার সেন্সর থেকে ডেটা ধরতে পারি। পাইলট-রিসিভের আউটপুটটি এর মতো দেখাচ্ছে:

{
        "message": {
                "id": 4095,
                "temperature": 409.5
        },
        "origin": "receiver",
        "protocol": "alecto_wsd17",
        "uuid": "0000-b8-27-eb-0f3db7",
        "repeats": 3
}
{
        "message": {
                "id": 1490,
                "temperature": 25.1,
                "humidity": 40.0,
                "battery": 1
        },
        "origin": "receiver",
        "protocol": "alecto_ws1700",
        "uuid": "0000-b8-27-eb-0f3db7",
        "repeats": 3
}
{
        "message": {
                "id": 2039,
                "temperature": 409.5
        },
        "origin": "receiver",
        "protocol": "alecto_wsd17",
        "uuid": "0000-b8-27-eb-0f3db7",
        "repeats": 4
}

এখন আপনার কাছে আমার প্রশ্ন: আইডিটি 1490 থেকে আমি কীভাবে তাপমাত্রা এবং আর্দ্রতা বের করতে পারি And এবং আপনি কীভাবে আমাকে ঘন ঘন এটি পরীক্ষা করতে বলবেন? ক্রোন জব দ্বারা যা প্রতি 10 মিনিটে চলে, পাইলট-প্রাপ্তির একটি আউটপুট তৈরি করে, আউটপুটটির ডেটা বের করে এবং স্মার্ট হোম কন্ট্রোল এপিতে এটি ঠেলে দেয়।

কারও ধারণা আছে - অনেক অনেক ধন্যবাদ


3
ফর্ম্যাটটি JSON বলে মনে হচ্ছে । জেএসওনকে পার্স করার প্রচুর উপায় রয়েছে। এটি নির্ভর করে আপনি কী আরামদায়ক। পাইথন? জাভাস্ক্রিপ্ট? অন্যকিছু?
মুরু

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

1
এটি দিয়ে অসুবিধা নেই awkএবং sedসরবরাহ করা হয়েছে জেএসএন আউটপুট এখানে প্রদর্শিত ফর্ম্যাটিংটি ধরে রাখে, যার এটির দরকার নেই - হোয়াইটস্পেস জেএসএনের পক্ষে কোনও ব্যাপার নয়। উদাহরণস্বরূপ, এই awkআদেশ: awk '/temperature|humidity/ {print $2}'কাছাকাছি।
মুরু

4
সঙ্গে ksh93JSON পার্সিং করার builtin হয় read
মাইক্রজারভের

1
হুইজি-ব্যাকপোর্টগুলি পরীক্ষা করুন। এটি সেখানে থাকতে পারে, আপনাকে জেসিতে আপগ্রেড সংরক্ষণ করতে পারে (যদি না আপনি যে কোনওভাবেই আপগ্রেড করার পরিকল্পনা না করেন)। আহা! এটি হুইজে ফিরে আসে। packages.debian.org/wheezy-backports/jq
সি এ এস

উত্তর:


23

আপনি jqশেল জেএসন ফাইলগুলি প্রক্রিয়া করতে ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, আমি আপনার নমুনা জসন ফাইলটি সেভাবে সংরক্ষণ করেছি raul.jsonএবং তারপরে দৌড়েছি:

$ jq .message.temperature raul.json 
409.5
25.1
409.5
$ jq .message.humidity raul.json 
null
40
null

jq বেশিরভাগ লিনাক্স ডিস্ট্রোসের জন্য প্রাক-প্যাকেজযুক্ত উপলব্ধ।

এটি jqনিজেই করার একটি উপায় সম্ভবত আছে তবে আমি উভয়কেই এক লাইনে পছন্দসই মানগুলি খুঁজে পেতে সবচেয়ে সহজ উপায়টি ব্যবহার করা xargs। উদাহরণ স্বরূপ:

$ jq 'select(.message.id == 1490) | .message.temperature, .message.humidity' raul.json | xargs
25.1 40

বা, আপনি যদি প্রতিটি .message.idউদাহরণের মধ্য দিয়ে লুপ করতে চান তবে আমরা .message.idআউটপুট যুক্ত করতে এবং ব্যবহার xargs -n 3করতে পারি যে আমরা জানি যে তিনটি ক্ষেত্র থাকবে (আইডি, তাপমাত্রা, আর্দ্রতা):

jq '.message.id, .message.temperature, .message.humidity' raul.json | xargs -n 3
4095 409.5 null
1490 25.1 40
2039 409.5 null

তারপরে আপনি এই আউটপুটটিকে বিশ্রী বা যে কোনও কিছুতে পোস্ট-প্রসেস করতে পারেন।


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


2
বিশেষভাবেjq 'select(.message.id == 1490) | .message.temperature, .message.humidity' raul.json
গ্লেন জ্যাকম্যান

1
বা, বাশ-এ,{ read temp; read hum; } < <(jq ...)
গ্লেন জ্যাকম্যান

1
আমার উত্তরটি দেখুন যা সহজভাবে ব্যবহার করে grep। এটি কয়েকটি নির্দিষ্ট সংস্করণের জন্য কাজ নাও করতে পারে grepতবে এটি জেনসন পার্স করার জন্য বিশেষভাবে ডিজাইন করা jqসত্ত্বেও এই দৃশ্যের তুলনায় এটি আরও সোজা-এগিয়ে রয়েছে jq। আমি jqউত্তর যাই হোক না কেন নির্বিশেষে একটি উত্সাহ দেওয়া। এটি প্রকৃতপক্ষে কাজের একটি হাতিয়ার, তবে কখনও কখনও আপনি প্রধান-অপসারণের আশেপাশে অনুসন্ধান করার চেয়ে আপনার আঙ্গুলগুলি দিয়ে স্ট্যাপলগুলি সরাতে পারেন।
রুবিনোরেলস

2
জসন এক্সএমএল বা এইচটিএমএল ক্যান এর চেয়ে বেশি নিয়মিত প্রকাশের সাথে নির্ভরযোগ্যভাবে পার্স করা যায় না। এবং বেশিরভাগ জসন ডেটা (যেমন ওয়েব এপিআইয়ের মাধ্যমে আনা) অতিরিক্ত লাইন-ফিড এবং ইন্ডেন্টেশন সহ সুন্দরভাবে ফর্ম্যাট হয় না। জসনকে নির্ভরযোগ্যভাবে পার্স করতে আপনার একটি জসন পার্সার প্রয়োজন। jqশেল স্ক্রিপ্টগুলির জন্য এটি একটি। অন্যান্য ভাষায় জেসন পার্সিং লাইব্রেরি রয়েছে।
ক্যাস

1
কিছু নিয়মিত প্রকাশের সাথে নির্ভরযোগ্যভাবে পার্স করা যায়। এটি ঠিক কতগুলি আপনি ব্যবহার করেন তার উপর নির্ভর করে । আপনি কিভাবে jqএটি মনে করেন?
মাইকসার্ভ

0

jqএটি এখন পর্যন্ত সবচেয়ে মার্জিত সমাধান। awkআপনি লিখতে পারে সঙ্গে

awk -v id=1490 '
    $1 == "\"id\":" && $2 == id"," {matched = 1}
    $1 == "}," {matched = 0}
    matched && $1 ~ /temperature|humidity/ {sub(/,/,"", $2); print $2}
' file

0

যারা উন্নত বুঝতে পারে না awkতেমনি তারাও পছন্দ করতে চায় (যেমন আমার মতো লোকেরা) এবং jqপ্রাক ইনস্টল করা নেই, তাদের জন্য একটি সহজ সমাধান একসাথে কয়েকটি দেশীয় কমান্ড পাইপ করা উচিত:

grep -A2 '"id": 1490,' stats.json | sed '/1490/d;s/"//g;s/,//;s/\s*//'

আপনি যদি কেবলমাত্র মানগুলি পাওয়ার চেষ্টা করছেন তবে এর grepচেয়ে awkবা কেবল ব্যবহার করে আরও সহজ sed:

grep -A2 '"id": 1490,' stats.json | grep -o "[0-9]*\.[0-9]*"

একটি ব্যাখ্যা দেওয়ার জন্য, এটি আমার কাছে সহজ উপায় বলে মনে হচ্ছে।

  • grep -A2লাইন আপনি নিম্নলিখিত 2 লাইন, যা তাপমাত্রা এবং আর্দ্রতা ধারণ সহ তাদেরকে JSON জন্য খুঁজছি হয় grabs।
  • grep -oকেবলমাত্র একটি দ্বারা পৃথক করা কেবলমাত্র অঙ্কগুলি মুদ্রণের জন্য পাইপটি .(যা কখনই প্রথম 1490লাইনে দেখা যায় না , তাই আপনি আপনার 2 টি মান - তাপমাত্রা এবং আর্দ্রতা দিয়ে রেখে যান Very খুব সহজ using এমনকি jqআমার মতে ব্যবহারের চেয়েও সহজ ।

0

কমান্ড লাইনে জেএসএন প্রসেস করার জন্য আমার পছন্দের সরঞ্জামটি হল জকিউ। তবে, আপনি যদি জিকিউ ইনস্টল না করে থাকেন তবে পার্লের সাথে আপনি বেশ ভাল করতে পারেন:

# perl -MJSON -e '$/ = undef; my $data = <>; for my $hash (new JSON->incr_parse($data)) { my $msg = $hash->{message}; print "$msg->{temperature} $msg->{humidity}\n" if $msg->{id} == 1490 }' < data.json
25.1 40

0

আপনার আউটপুট সম্পূর্ণ JSON এর পরিবর্তে JSON স্নিপেটের একটি সেট। যদি / একবার আপনি নিজের আউটপুটটিকে একটি অবিচ্ছেদ্য জেএসওএন হিসাবে পুনঃবিন্যাস করেন, যেমন: (আপনার আউটপুটটি ধরে নিচ্ছেন file.json):

echo "[ $(cat file.json | sed -E 's/^}$/},/; $d') }]"

তারপরে আপনি jtcসরঞ্জাম দিয়ে যা চান তা অর্জন করা সহজ (এখানে উপলব্ধ: https://github.com/ldn-softdev/jtc ):

bash $ echo "[ $(cat file.json | sed -E 's/^}$/},/; $d') }]" | jtc -x "[id]:<1490>d [-1]" -y[temperature] -y[humidity] -l
"temperature": 25.1
"humidity": 40.0
bash $ 

উপরের উদাহরণে -lযদি আপনি মুদ্রিত লেবেল না চান want

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