পাইথনে জেএসনকে কীভাবে পার্স করবেন?


281

আমার প্রকল্পটি বর্তমানে অজগরটিতে একটি জেএসওএন বার্তা পাচ্ছে যা আমার কাছে তথ্য বিটগুলি পাওয়া দরকার। এর উদ্দেশ্যগুলির জন্য, আসুন এটি স্ট্রিংয়ে কিছু সাধারণ JSON এ সেট করুন:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

এখনও অবধি আমি জেএসওন অনুরোধগুলি একটি তালিকা ব্যবহার করে জেনারেট করে যাচ্ছি এবং তারপরে json.dumps, তবে এর বিপরীত কাজ করার জন্য আমার মনে হয় আমাকে ব্যবহার করা দরকার json.loads। তবে এর সাথে আমার খুব ভাগ্য হয়নি। যে কেউ আমাকে একটি স্নিপেট প্রদান করতে পারে যা ফিরে আসবে"2""two" যা উপরের উদাহরণের ইনপুটটি দিয়ে ?


8
দ্রষ্টব্য : যারা এখানে 'একক-উদ্ধৃতি স্ট্রিং ডিলিমিটার ব্যবহার করে এমন ডেটা নিয়ে আসে তাদের জন্য আপনি সম্ভবত দুর্ঘটনাক্রমে পাইথন অভিধানগুলির জন্য স্ট্রিং উপস্থাপনা তৈরি করতে পারেন। জেএসএন সর্বদা "ডিলিমিটার ব্যবহার করবে । যদি তা হয় তবে আপনার কোডটি মেরামত করুন যা সেই আউটপুটটির json.dumps()পরিবর্তে str()বা ব্যবহারের জন্য উত্পাদন করে repr()এবং অভিধানের একটি স্ট্রিং প্রতিনিধিত্ব রূপান্তর করতে চলে যান ? কীভাবে আপনার পাইথন ডেটা পুনরুদ্ধার করবেন তা নির্ধারণ করতে। আপনি কি পাইথন আক্ষরিক অন্যান্য ক্লু? জন্য অনুসন্ধান করুন None, Trueবা False, JSON ব্যবহার করবে null, true& false
মার্টিজন পিটারস

যারা একটি jsonStr কিন্তু একটি (সম্ভবত সঙ্গে অভিধান তালিকা নেই ': একক উদ্ধৃতি স্ট্রিং বিভেদক), এছাড়াও একটি চেহারা এখানে stackoverflow.com/questions/41168558/...
লরেঞ্জ

উত্তর:


493

খুব সহজ:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

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

2
আমি আসলে ইতিমধ্যে simplejson ব্যবহার করছি: import simplejson as json। উল্লেখ করতে ভুলে গেছেন তবে ধন্যবাদ :)
ingh.am

বুঝেছি. ব্যবহার করছিলেন .loadপরিবর্তে পদ্ধতি.loads
সুনীল কুমার

85

কখনও কখনও আপনার json একটি স্ট্রিং হয় না। উদাহরণস্বরূপ, আপনি যদি কোনও ইউআরএল থেকে কোনও জসন পেয়ে থাকেন:

j = urllib2.urlopen('http://site.com/data.json')

আপনার json.load ব্যবহার করা দরকার, json.loads নয়:

j_obj = json.load(j)

(এটি ভুলে যাওয়া সহজ: 'গুলি' স্ট্রিং'র জন্য)


কেবল যুক্ত করার জন্য আপনি j.read () কল করে স্ট্রিং সামগ্রী পেতে পারেন এবং তারপরে লোড পদ্ধতিটি ব্যবহার করতে পারেন। এই ক্ষেত্রে যে কোনও উপায়ে লোড () পদ্ধতিটি .রেড () কল করতে যত্ন নেয়
rkachach

51

URL বা ফাইলের জন্য ব্যবহার করুন json.load()। .Json সামগ্রী সহ স্ট্রিংয়ের জন্য, ব্যবহার করুন json.loads()

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

নিম্নলিখিতটি আপনাকে সাহায্য করতে পারে এমন সাধারণ উদাহরণ:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

উপরের কোডটির আউটপুট হবে:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

নোট করুন যে আপনি এটির মতো মুদ্রণের জন্য ডাম্পের সনাক্তকরণ যুক্তিটি সেট করতে পারেন (উদাহরণস্বরূপ, json.dumps প্রিন্ট ব্যবহার করার সময় (ডেটা, ইনডেন্ট = 4)):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

জসন বা অ্যাস্ট পাইথন মডিউলগুলি ব্যবহার করতে পারেন:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
আপনি ast.literal_eval()JSON এর জন্য ফাংশনটি ব্যবহার করতে পারবেন না , কারণ আপনার তুচ্ছ পাঠ্য এবং পূর্ণসংখ্যার কেবলমাত্র উদাহরণগুলি আপনি ইস্যুতে চালিত করবেন beyond জেএসএন পাইথন নয় । শুধু কারণ কিছু JSON সঙ্গে পার্স করা যাবে ast.literal_eval()যে একটি সঠিক পদ্ধতির দেখা যায় না।
Martijn Pieters

1
উদাহরণস্বরূপ, আপনি r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'ব্যবহার করে বিশ্লেষণ করতে পারবেন না ast.literal_eval(), কারণ এতে নালস, একটি বুলিয়ান মান এবং একটি একক নন-বিএমপি কোডপয়েন্ট রয়েছে। জেএসওএন সেই মানগুলিকে পৃথকভাবে উপস্থাপন করে যে কীভাবে পাইথন লিটারালগুলি সেগুলি উপস্থাপন করে। json.loads()অন্য দিকে, যে ইনপুট সঙ্গে কোন বিষয় আছে এবং সঠিকভাবে decodes যে {'foo': None, 'bar': True, 'baz': '🤦'}
Martijn Pieters

1
এরপরে, ast.literal_eval()বেশ খানিকটা ধীর এবং কাস্টমাইজ করা যায় না। আপনার কখনই এটি JSON ডিকোডিংয়ের জন্য ব্যবহার করা উচিত নয়
মার্টিজন পিটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.