পাইথন ব্যবহার করে JSON পার্স করবেন?


18

members.jsonনীচের মত আমার কাছে একটি JSON ফাইল রয়েছে ।

{
   "took": 670,
   "timed_out": false,
   "_shards": {
      "total": 8,
      "successful": 8,
      "failed": 0
   },
   "hits": {
      "total": 74,
      "max_score": 1,
      "hits": [
         {
            "_index": "2000_270_0",
            "_type": "Medical",
            "_id": "02:17447847049147026174478:174159",
            "_score": 1,
            "_source": {
               "memberId": "0x7b93910446f91928e23e1043dfdf5bcf",
               "memberFirstName": "Uri",
               "memberMiddleName": "Prayag",
               "memberLastName": "Dubofsky"
            }
         }, 
         {
            "_index": "2000_270_0",
            "_type": "Medical",
            "_id": "02:17447847049147026174478:174159",
            "_score": 1,
            "_source": {
               "memberId": "0x7b93910446f91928e23e1043dfdf5bcG",
               "memberFirstName": "Uri",
               "memberMiddleName": "Prayag",
               "memberLastName": "Dubofsky"
            }
         }
      ]
   }
}

আমি ব্যবহার করে এটি বিশ্লেষণ করতে চান bashস্ক্রিপ্ট পেতে কেবল পঠন ক্ষেত্র তালিকা memberId

প্রত্যাশিত আউটপুটটি হ'ল:

memberIds
----------- 
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG

আমি নিম্নলিখিত বাশ + পাইথন কোড যুক্ত করার চেষ্টা করেছি .bashrc:

function getJsonVal() {
   if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then
       echo "Usage: getJsonVal 'key' < /tmp/file";
       echo "   -- or -- ";
       echo " cat /tmp/input | getJsonVal 'key'";
       return;
   fi;
   cat | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["'$1'"]';
}

এবং তারপরে বলা হয়:

$ cat members.json | getJsonVal "memberId"

তবে এটি ছুড়ে ফেলে:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
KeyError: 'memberId'

উল্লেখ

/programming//a/21595107/432903


2
বাশে কেন আপনার এটি করা দরকার? আপনি এখানে স্পষ্টভাবে অজগর ব্যবহার করছেন তাই কেন কেবল একটি অজগর স্ক্রিপ্ট তৈরি করবেন না যা কাজ করে? বাশ দিয়ে কীভাবে এটি করা যায় সে সম্পর্কে আপনি প্রকৃত উত্তর পেতে পারেন না কারণ যখন আপনাকে আরও কিছু করার দরকার হয় আপনি অন্য ভাষা ব্যবহার করেন।
ডেভিডজি

আমি থেকে আপনার শিরোনাম পরিবর্তন "ব্যাশ স্ক্রিপ্ট ব্যবহারের" থেকে "পাইথন ব্যবহার" যেহেতু python, এবং bashকি পার্স JSON ব্যবহার করা হয়। উদাহরণস্বরূপ, ত্রুটিটি অবশ্যই একটি অজগর ত্রুটি, বাশ ত্রুটি নয়।
স্বর্ণলোক

@ গোল্ডিলোকস কেবল তার চেষ্টাটি ব্যবহার করার কারণে python, তার লক্ষ্যটি ব্যবহার করার অর্থ নয়python
জর্ডানম

@ ডেভিডজি আমার উত্তর দেখুন। এটি খাঁটি শেল নয়, এটি একটি বাহ্যিক কমান্ড তবে এটি শেল স্ক্রিপ্টগুলিতে খুব ভালভাবে সংহত করে।
jordanm

আমি কি আপনাকে জসনের বেশিরভাগ অপ্রাসঙ্গিক ক্ষেত্রগুলি সরিয়ে নেওয়ার পরামর্শ দিতে পারি? আপনি যা করার চেষ্টা করছেন তার सारটি পেতে _ সোর্সটিতে ২-৩ টি উপাদান থাকা যথেষ্ট।
অ্যান্থন

উত্তর:


25

আপনি যদি ব্যবহার করবেন:

 $ cat members.json | \
     python -c 'import json,sys;obj=json.load(sys.stdin);print obj;'

আপনি নেস্টেড স্বৈরাচারের কাঠামোটি পরীক্ষা করতে পারেন objএবং দেখতে পাবেন যে আপনার মূল লাইনটি পড়তে হবে:

$ cat members.json | \
    python -c 'import json,sys;obj=json.load(sys.stdin);print obj["hits"]["hits"][0]["_source"]["'$1'"]';

যে "সদস্যআইডি" উপাদান। এইভাবে আপনি পাইথনকে অনলাইনার হিসাবে রাখতে পারেন।

যদি নেস্টেড "হিট" উপাদানটিতে একাধিক উপাদান থাকে তবে আপনি এর মতো কিছু করতে পারেন:

$ cat members.json | \
python -c '
import json, sys
obj=json.load(sys.stdin)
for y in [x["_source"]["'$1'"] for x in obj["hits"]["hits"]]:
    print y
'

ক্রিস ডাউন এর সমাধানটি যে কোনও স্তরের (অনন্য) কীগুলির একক মান সন্ধানের জন্য ভাল।

আমার দ্বিতীয় উদাহরণ যা একাধিক মান মুদ্রণ করে আপনি একটি লাইনারের সাহায্যে আপনার কী চেষ্টা করা উচিত তার সীমাটি মারছেন, সেই সময়ে আমি বাশে অর্ধেক প্রসেসিংয়ের সামান্য কারণ দেখি এবং একটি সম্পূর্ণ পাইথন সমাধানে স্থানান্তরিত করব ।


8

ব্যাশে এটি করার আরেকটি উপায় হ'ল জ্বশন । আপনার সমস্যার সমাধানটি এখানে ব্যবহার করে jshon:

$ jshon -e hits -e hits -a -e _source -e memberId -u < foo.json
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG

-eঅপশন JSON থেকে মানগুলি নিষ্কর্ষ। -aঅ্যারের উপর iterates এবং -uচূড়ান্ত স্ট্রিং decodes।


আমাকে jshon ইনস্টল করতে দিন

6

ঠিক আছে, আপনার কীটি পুরোপুরি স্পষ্টভাবে অবজেক্টের মূলে নেই। এরকম কিছু চেষ্টা করুন:

json_key() {
    python -c '
import json
import sys

data = json.load(sys.stdin)

for key in sys.argv[1:]:
    try:
        data = data[key]
    except TypeError:  # This is a list index
        data = data[int(key)]

print(data)' "$@"
}

এটি কেবল পাইথনে সিনট্যাক্স ইনজেকশন না করার সুবিধা রয়েছে, যা বিঘ্ন ঘটতে পারে (বা আরও খারাপ, নির্বিচারে কোড কার্যকর করতে পারে)।

তারপরে আপনি এটিকে এভাবে কল করতে পারেন:

json_key hits hits 0 _source memberId < members.json

1
দ্রষ্টব্য: এটি "হিট" এর প্রতিটি আইটেমের উপর লুপ করবে না। যদি আপনি এটি চান তবে আপনার অবশ্যই উদাহরণটির জন্য নির্দিষ্ট পাইথন কোডটি লিখতে হবে।
ক্রিস ডাউন

তবে এটিতে কেবলমাত্র একটি সদস্য আইডি দেখায়।
7:51

4

আর একটি বিকল্প জেকিউ :

$ cat members.json | jq -r '.hits|.hits|.[]|._source|.memberId'
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG

2

এটা চেষ্টা কর:

$ cat json.txt | python -c 'import sys; import simplejson as json; \
print "\n".join( [i["_source"]["memberId"] for i in json.loads( sys.stdin.read() )["hits"]["hits"]] )'


আপনার যদি ইতিমধ্যে pretty printedজসন থাকে তবে আপনি কেবল grepএটি করেন না কেন ?

$ cat json.txt | grep memberId
               "memberId": "0x7b93910446f91928e23e1043dfdf5bcf",
               "memberId": "0x7b93910446f91928e23e1043dfdf5bcG",

আপনি সর্বদা এটিতে সিম্পজসন পাইথন সহ একটি সুন্দর মুদ্রিত ফর্ম্যাট পেতে grepপারেন।

# cat json_raw.txt
{"hits": {"hits": [{"_score": 1, "_type": "Medical", "_id": "02:17447847049147026174478:174159", "_source": {"memberLastName": "Dubofsky", "memberMiddleName": "Prayag", "memberId": "0x7b93910446f91928e23e1043dfdf5bcf", "memberFirstName": "Uri"}, "_index": "2000_270_0"}, {"_score": 1, "_type": "Medical", "_id": "02:17447847049147026174478:174159", "_source": {"memberLastName": "Dubofsky", "memberMiddleName": "Prayag", "memberId": "0x7b93910446f91928e23e1043dfdf5bcG", "memberFirstName": "Uri"}, "_index": "2000_270_0"}], "total": 74, "max_score": 1}, "_shards": {"successful": 8, "failed": 0, "total": 8}, "took": 670, "timed_out": false}

ডাম্প ব্যবহার করুন:

# cat json_raw.txt | python -c 'import sys; import simplejson as json; \
print json.dumps( json.loads( sys.stdin.read() ), sort_keys=True, indent=4); '

{
    "_shards": {
        "failed": 0,
        "successful": 8,
        "total": 8
    },
    "hits": {
        "hits": [
            {
                "_id": "02:17447847049147026174478:174159",
                "_index": "2000_270_0",
                "_score": 1,
                "_source": {
                    "memberFirstName": "Uri",
                    "memberId": "0x7b93910446f91928e23e1043dfdf5bcf",
                    "memberLastName": "Dubofsky",
                    "memberMiddleName": "Prayag"
                },
                "_type": "Medical"
            },
            {
                "_id": "02:17447847049147026174478:174159",
                "_index": "2000_270_0",
                "_score": 1,
                "_source": {
                    "memberFirstName": "Uri",
                    "memberId": "0x7b93910446f91928e23e1043dfdf5bcG",
                    "memberLastName": "Dubofsky",
                    "memberMiddleName": "Prayag"
                },
                "_type": "Medical"
            }
        ],
        "max_score": 1,
        "total": 74
    },
    "timed_out": false,
    "took": 670
}

এরপরে, কেবল grep'সদস্য আইডি' প্যাটার্নের ফলাফল।

সম্পূর্ণ নির্ভুল হতে:

#!/bin/bash

filename="$1"
cat $filename | python -c 'import sys; import simplejson as json; \
print json.dumps( json.loads( sys.stdin.read() ), sort_keys=True, indent=4)' | \
grep memberId | awk '{print $2}' | sed -e 's/^"//g' | sed -e 's/",$//g'

ব্যবহার:

$ bash bash.sh json_raw.txt 
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG


0

ডিপডিফ ব্যবহার করে আপনাকে সঠিক কীগুলি জানতে হবে না:

import json
from deepdiff import DeepSearch
DeepSearch(json.load(open("members.json", "r")), 'memberId', verbose_level=2)['matched_paths'].values()

0

এখানে একটি বাশ সমাধান।

  1. ফাইল তৈরি করুন find_members.sh
  2. ফাইল + সেভ করতে নিম্নলিখিত লাইনটি যুক্ত করুন

    #!/bin/bash
    
    echo -e "\nmemberIds\n---------"
    cat members.json | grep -E 'memberId'|awk '{print$2}' | cut -d '"' -f2
  3. chmod +x find_members.sh

এখন এটি চালান:

$ ./find_members.sh

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