2010-10-02 55 views
29

Có thể chuyển đổi chuỗi json (ví dụ: chuỗi được trả về từ dịch vụ json tìm kiếm twitter) thành các đối tượng chuỗi đơn giản hay không. Đây là một đại diện nhỏ của dữ liệu trả về từ dịch vụ json:chuyển đổi chuỗi json thành đối tượng python

{ 
results:[...], 
"max_id":1346534, 
"since_id":0, 
"refresh_url":"?since_id=26202877001&q=twitter", 
. 
. 
. 
} 

Cho phép nói rằng tôi bằng cách nào đó lưu trữ kết quả trong một số biến, chẳng hạn, obj. Tôi đang tìm kiếm để có được giá trị thích hợp như như sau:

print obj.max_id 
print obj.since_id 

Tôi đã cố gắng sử dụng simplejson.load()json.load() nhưng nó đã cho tôi một lỗi nói 'str' object has no attribute 'read'

Trả lời

65

Tôi đã cố gắng sử dụng simplejson.load()json.load() nhưng nó đã cho tôi lỗi khi nói 'str' object has no attribute 'read'

Để tải từ một chuỗi, hãy sử dụng json.loads() (lưu ý 's').

Hiệu quả hơn, bỏ qua bước đọc phản hồi thành chuỗi và chỉ chuyển trả lời cho json.load().

+0

oh, không biết rằng tôi nhận được từ điển. Dù sao thì tốt cho thời điểm này ... – deostroll

0

nếu bạn không biết nếu các dữ liệu sẽ là một tập tin hoặc một chuỗi .... sử dụng

import StringIO as io 
youMagicData={ 
results:[...], 
"max_id":1346534, 
"since_id":0, 
"refresh_url":"?since_id=26202877001&q=twitter", 
. 
. 
. 
} 

magicJsonData=json.loads(io.StringIO(str(youMagicData)))#this is where you need to fix 
print magicJsonData 
#viewing fron the center out... 
#youMagicData{}>str()>fileObject>json.loads 
#json.loads(io.StringIO(str(youMagicData))) works really fast in my program and it would work here so stop wasting both our reputation here and stop down voting because you have to read this twice 

từ https://docs.python.org/3/library/io.html#text-i-o

json.loads từ python built-in thư viện, json .loads yêu cầu một đối tượng tập tin và không kiểm tra những gì nó được truyền vì vậy nó vẫn gọi hàm đọc trên những gì bạn đã truyền vì đối tượng tệp chỉ cho phép dữ liệu khi bạn gọi read(). Vì vì lớp chuỗi dựng sẵn không có hàm đọc nên chúng ta cần một trình bao bọc. Vì vậy, các StringIO.StringIO chức năng trong ngắn hạn, phân lớp lớp chuỗi và lớp tập tin và chia lưới các hoạt động bên trong nghe chi tiết thấp của tôi xây dựng lại https://gist.github.com/fenderrex/843d25ff5b0970d7e90e6c1d7e4a06b1 vì vậy ở phần cuối của tất cả của nó giống như viết một tập tin ram và jsoning nó ra trong một dòng. ...

0
magicJsonData=json.loads(io.StringIO((youMagicData).decode("utf-8")) 
print(magicJsonData) 

chuỗi json từ bất kỳ yêu cầu hoặc http server kiểu byte mảng để chuyển đổi chúng trong chuỗi, (kể từ khi câu hỏi là về mảng byte trở về từ một máy chủ yêu cầu, phải không?)

res = json.loads((response.content).decode("utf-8")) 
print(res) 

tại đây, response.content có thể là mảng byte hoặc bất kỳ chuỗi trả về nào từ yêu cầu máy chủ được giải mã thành định dạng chuỗi (utf-8) và được trả về dưới dạng mảng python.

Hoặc chỉ cần sử dụng dấu gạch ngang nhưng sử dụng json.load thay vì json.loads

Các vấn đề liên quan