2014-07-22 14 views
51

tôi có một loạt các dữ liệu JSON từ Facebook bài viết như hình dưới đây:Kiểm tra nếu chính tồn tại và lặp mảng JSON sử dụng Python

{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"} 

Các dữ liệu JSON là bán cấu trúc và tất cả là không giống nhau. Dưới đây là mã của tôi:

import json 

str = '{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}' 
data = json.loads(str) 

post_id = data['id'] 
post_type = data['type'] 
print(post_id) 
print(post_type) 

created_time = data['created_time'] 
updated_time = data['updated_time'] 
print(created_time) 
print(updated_time) 

if data.get('application'): 
    app_id = data['application'].get('id', 0) 
    print(app_id) 
else: 
    print('null') 

#if data.get('to'): 
#... This is the part I am not sure how to do 
# Since it is in the form "to": {"data":[{"id":...}]} 

Tôi muốn mã để in to_id như 1543 khác in 'null'

Tôi không chắc chắn làm thế nào để làm điều này.

Cảm ơn!

Trả lời

80
import json 

jsonData = """{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}""" 

def getTargetIds(jsonData): 
    data = json.loads(jsonData) 
    if 'to' not in data: 
     raise ValueError("No target in given data") 
    if 'data' not in data['to']: 
     raise ValueError("No data for target") 

    for dest in data['to']['data']: 
     if 'id' not in dest: 
      continue 
     targetId = dest['id'] 
     print("to_id:", targetId) 

Output:

In [9]: getTargetIds(s) 
to_id: 1543 
+2

Tại sao làm điều này rõ ràng 'in' kiểm tra và 'nâng cao 'nếu họ bị thiếu? Chỉ cần truy cập nó mà không kiểm tra, và bạn sẽ nhận được chính xác cùng một hành vi (ngoại trừ với một 'KeyError' thay vì' ValueError'). – abarnert

3
jsonData = """{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}, {"name": "Joe Schmoe"}]}, "type": "status", "id": "id_7"}""" 

def getTargetIds(jsonData): 
    data = json.loads(jsonData) 
    for dest in data['to']['data']: 
     print("to_id:", dest.get('id', 'null')) 

Thử:

>>> getTargetIds(jsonData) 
to_id: 1543 
to_id: null 

Hoặc, nếu bạn chỉ muốn bỏ qua các giá trị thiếu id thay vì in 'null':

def getTargetIds(jsonData): 
    data = json.loads(jsonData) 
    for dest in data['to']['data']: 
     if 'id' in to_id: 
      print("to_id:", dest['id']) 

Vì vậy:

>>> getTargetIds(jsonData) 
to_id: 1543 

Tất nhiên trong cuộc sống thực, có thể bạn không muốn print mỗi id, nhưng để lưu trữ chúng và làm điều gì đó với họ, nhưng đó là một vấn đề khác.

22

Nếu tất cả các bạn muốn là để kiểm tra xem key tồn tại hay không

h = {'a': 1} 
'b' in h # returns False 

Nếu bạn muốn kiểm tra nếu có một giá trị cho khóa

h.get('b') # returns None 

Return một giá trị mặc định nếu giá trị thực tế là thiếu

h.get('b', 'Default value') 
1

Thực tiễn tốt là tạo phương thức tiện ích trợ giúp cho những thứ như vậy để bất cứ khi nào bạn cần thay đổi logic của xác nhận thuộc tính nó sẽ ở một nơi và mã sẽ dễ đọc hơn đối với những người theo dõi.

Ví dụ tạo ra một phương pháp helper (hoặc lớp JsonUtils với các phương pháp tĩnh) trong json_utils.py:

def has_attribute(data, attribute): 
    return attribute in data and data[attribute] is not None 

và sau đó sử dụng nó trong dự án của bạn:

from json_utils import has_attribute 

if has_attribute(data, 'to') and has_attribute(data['to'], 'data'): 
    for item in data['to']['data']: 
     if has_attribute(item, 'id'): 
      to_id = item['id'] 
     else: 
      to_id = 'null' 

     print('The id is: %s' % to_id) 
Các vấn đề liên quan