2011-10-14 61 views
142

Dự án của tôi hiện đang nhận được một tin nhắn JSON trong python mà tôi cần lấy các thông tin trong số đó. Theo mục đích của việc này, cho phép thiết lập nó để một số đơn giản JSON trong một chuỗi:Phân tích cú pháp JSON trong Python

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

Cho đến nay tôi đã tạo ra các yêu cầu JSON sử dụng một danh sách và sau đó json.dumps nhưng để làm ngược lại những điều này tôi nghĩ tôi cần để sử dụng json.loads nhưng tôi đã không có nhiều may mắn với nó. Bất cứ ai có thể cung cấp cho tôi một đoạn mà sẽ trả về "2" với đầu vào của "hai" trong ví dụ trên?

Trả lời

282

Rất đơn giản:

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

Cảm ơn. Tôi cảm thấy ngớ ngẩn bây giờ, tôi đã cố gắng làm điều đó bằng chỉ mục ... –

+0

Ngoài ra, hãy xem [simplejson] (http://code.google.com/p/simplejson/) nếu bạn cần hiệu năng tốt hơn. Các phiên bản gần đây cung cấp các tối ưu hóa cải thiện đáng kể việc đọc và viết. – Unode

+1

Tôi thực sự đang sử dụng simplejson: 'import simplejson as json'. Quên đề cập đến nhưng cảm ơn :) –

60

Đôi khi json của bạn không phải là một chuỗi. Ví dụ, nếu bạn đang nhận được một json từ một url như thế này:

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

bạn sẽ cần phải sử dụng json.load, không json.loads:

j_obj = json.load(j) 

(nó rất dễ dàng để quên: các 's' là dành cho 'chuỗi')

+1

Không biết điều đó, cảm ơn! –

+0

Chỉ cần thêm rằng bạn có thể lấy nội dung chuỗi bằng cách gọi j.read() và sau đó sử dụng phương thức tải. Bất kỳ cách nào trong trường hợp này, phương thức load() sẽ xử lý việc gọi .read() – redobot

23

Đối với URL hoặc FIle, hãy sử dụng json.load(). Đối với chuỗi có nội dung .json, hãy sử dụng json.loads().

#! /usr/bin/python 

import json 
from pprint import pprint 

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

json_data=open(json_file) 
data = json.load(json_data) 
#pprint(data) 
json_data.close() 

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

Sau đây là ví dụ đơn giản có thể giúp bạn:

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) 

Các đầu ra cho các mã trên sẽ là:

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

Lưu ý rằng bạn có thể thiết lập các tham số ident tự đổ để in nó như vậy (ví dụ: khi sử dụng json.dumps in (dữ liệu, indent = 4)):

{ 
    "pk": 1, 
    "fb": { 
     "new_key": "cc.ee was present!", 
     "fd_id": "12345", 
     "fc": "" 
    }, 
    "fa": "cc.ee" 
} 
Các vấn đề liên quan