วิธีการวิเคราะห์ JSON ใน Python


282

โครงการของฉันกำลังรับข้อความ JSON ใน python ซึ่งฉันต้องได้รับข้อมูลบางส่วน เพื่อจุดประสงค์นี้ลองตั้งค่าเป็น JSON แบบง่าย ๆ ในสตริง:

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

จนถึงขณะนี้ผมได้รับการสร้าง JSON คำขอใช้รายการแล้วแต่จะทำตรงข้ามของนี้ผมคิดว่าผมจำเป็นต้องใช้json.dumps json.loadsอย่างไรก็ตามฉันไม่ได้โชคดีกับมัน ทุกคนสามารถให้ข้อมูลโค้ดที่จะกลับมา"2"พร้อมกับการป้อนข้อมูล"two"ในตัวอย่างข้างต้นหรือไม่


8
หมายเหตุ : สำหรับผู้ที่มาที่นี่พร้อมกับข้อมูลที่ใช้'ตัวคั่นสตริงอัญประกาศเดี่ยวคุณอาจสร้างการแทนค่าสตริงสำหรับพจนานุกรม Python โดยไม่ได้ตั้งใจแทน JSON จะใช้"ตัวคั่นเสมอ หากเป็นเช่นนั้นให้ซ่อมแซมรหัสของคุณที่สร้างผลลัพธ์นั้นเพื่อใช้json.dumps()แทนstr()หรือrepr()และตรงไปที่แปลงการแสดงสตริงของพจนานุกรมเป็นพจนานุกรมหรือไม่ เพื่อหาวิธีกู้คืนข้อมูล Python ของคุณ เบาะแสอื่น ๆ ที่คุณมีตัวอักษร Python หรือไม่ มองหาNone, TrueหรือFalse, JSON จะใช้null, และtrue false
Martijn Pieters

ผู้ที่ไม่มี jsonStr แต่เป็นพจนานุกรม (อาจมี'ตัวคั่นสตริงคำพูดเดียว) ดูได้ที่นี่: stackoverflow.com/questions/41168558/ …
Lorenz

คำตอบ:


493

ง่ายมาก:

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

นอกจากนี้ให้ดูที่simplejsonถ้าคุณต้องการประสิทธิภาพที่ดีขึ้น เวอร์ชันล่าสุดจะให้การปรับแต่งที่ปรับปรุงการอ่านและการเขียนอย่างมาก
Unode

2
จริงๆแล้วฉันใช้งาน simplejson อยู่แล้ว: import simplejson as json. ลืมพูดถึง แต่ขอบคุณ :)
ingh.am

เข้าใจแล้ว ใช้.loadวิธีการแทน.loads
Sunil Kumar

85

บางครั้ง json ของคุณไม่ใช่สตริง ตัวอย่างเช่นหากคุณได้รับ json จาก url เช่นนี้:

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

คุณจะต้องใช้ json.load ไม่ใช่ json.loads:

j_obj = json.load(j)

(มันง่ายที่จะลืม: 's' ใช้สำหรับ 'string')


เพียงเพิ่มที่คุณสามารถรับเนื้อหาสตริงโดยการเรียก j.read () แล้วใช้วิธีการโหลด วิธีใดก็ตามในกรณีนี้วิธีโหลด () จะดูแลการเรียกใช้ .
read

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"}

โปรดทราบว่าคุณสามารถตั้งค่าอาร์กิวเมนต์ ident ของดัมพ์เพื่อพิมพ์ได้เช่น (ตัวอย่างเช่นเมื่อใช้ print json.dumps (data, indent = 4)):

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

-2

สามารถใช้โมดูล json หรือ ast หลาม:

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 ได้เนื่องจากนอกเหนือจากตัวอย่างข้อความและเลขจำนวนเต็มอย่างเดียวของคุณคุณจะพบปัญหา JSON ไม่หลาม เพียงเพราะJSON บางส่วนสามารถแยกวิเคราะห์ด้วยast.literal_eval()ไม่ได้ทำให้วิธีการที่เหมาะสม
Martijn Pieters

1
ตัวอย่างเช่นคุณไม่สามารถแยกวิเคราะห์การr'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'ใช้ast.literal_eval()เนื่องจากมันมีค่า Null ค่าบูลีนและ codepoint ที่ไม่ใช่ BMP เดียว JSON แทนค่าเหล่านั้นแตกต่างจากวิธีที่ตัวอักษร Python แสดงถึงค่าเหล่านั้น json.loads()ในมืออื่น ๆ ที่มีปัญหาเกี่ยวกับการป้อนข้อมูลที่ไม่ถูกต้องและถอดรหัสที่{'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters

1
ถัดไปast.literal_eval()ค่อนข้างช้าและไม่สามารถกำหนดเองได้ คุณควรจะไม่เคยใช้มันสำหรับการถอดรหัส JSON
Martijn Pieters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.