2012-09-10 45 views
5

Tôi đang ở trên đầu của tôi, cố gắng phân tích cú pháp JSON lần đầu tiên của tôi và xử lý mảng đa chiều.Phân tích cú pháp mảng Json muilti chiều tới Python

{ 
    "secret": "[Hidden]", 
    "minutes": 20, 
    "link": "http:\/\/www.1.com", 
    "bookmark_collection": { 
    "free_link": { 
     "name": "#free_link#", 
     "bookmarks": [ 
     { 
      "name": "1", 
      "link": "http:\/\/www.1.com" 
     }, 
     { 
      "name": "2", 
      "link": "http:\/\/2.dk" 
     }, 
     { 
      "name": "3", 
      "link": "http:\/\/www.3.in" 
     } 
     ] 
    }, 
    "boarding_pass": { 
     "name": "Boarding Pass", 
     "bookmarks": [ 
     { 
      "name": "1", 
      "link": "http:\/\/www.1.com\/" 
     }, 
     { 
      "name": "2", 
      "link": "http:\/\/www.2.com\/" 
     }, 
     { 
      "name": "3", 
      "link": "http:\/\/www.3.hk" 
     } 
     ] 
    }, 
    "sublinks": { 
     "name": "sublinks", 
     "link": [ 
     "http:\/\/www.1.com", 
     "http:\/\/www.2.com", 
     "http:\/\/www.3.com" 
     ] 
    } 
    } 
} 

Điều này được chia thành 3 phần, dữ liệu tĩnh trên thứ nguyên đầu tiên của tôi (bí mật, phút, liên kết) Tôi cần nhận được các chuỗi riêng biệt.

Sau đó, tôi cần từ điển cho mỗi "bộ sưu tập dấu trang" không có tên cố định, vì vậy tôi cần tên của chúng và các liên kết/tên của mỗi dấu trang.

Sau đó, có các liên kết phụ riêng biệt luôn giống nhau, nơi tôi cần tất cả các liên kết trong một từ điển riêng biệt.

Tôi đang đọc về phân tích cú pháp JSON nhưng hầu hết nội dung tôi tìm thấy là một mảng đơn giản được đưa vào 1 từ điển. Có ai có kỹ thuật tốt để làm điều này không?

+0

http://docs.python.org/tutorial/datastructures.html –

+0

Tôi không nghĩ bạn đang sử dụng từ "mảng" đúng ở đây. Theo mảng, tôi nghĩ "hầu hết mọi người" có nghĩa là cấu trúc dữ liệu đa chiều có thể gồm các phần tử cùng loại. JSON, và Python couterpart của chúng "các dicts và danh sách tùy ý" thường không phải là mảng, mà là "đối tượng", đó là toàn bộ điểm của nó: cái gì đó để "giữ" một cấu trúc tùy ý của các đối tượng tùy ý (đối tượng phải có kiểu json-serializeable)). – heltonbiker

+0

vâng, đó cũng có thể là lý do tại sao googling của tôi thất bại thảm hại .. –

Trả lời

11

Sau khi bạn phân tích cú pháp JSON, bạn sẽ kết thúc bằng một dict Python. Vì vậy, giả sử JSON ở trên nằm trong một chuỗi có tên input_data:

import json 
# This converts from JSON to a python dict 
parsed_input = json.loads(input_data) 

# Now, all of your static variables are referenceable as keys: 
secret = parsed_input['secret'] 
minutes = parsed_input['minutes'] 
link = parsed_input['link'] 

# Plus, you can get your bookmark collection as: 
bookmark_collection = parsed_input['bookmark_collection'] 

# Print a list of names of the bookmark collections... 
print bookmark_collection.keys() # Note this contains sublinks, so remove it if needed 

# Get the name of the Boarding Pass bookmark: 
print bookmark_collection['boarding_pass']['name'] 

# Print out a list of all bookmark links as: 
# Boarding Pass 
# * 1: http://www.1.com/ 
# * 2: http://www.2.com/ 
# ... 
for bookmark_definition in bookmark_collection.values(): 
    # Skip sublinks... 
    if bookmark_definition['name'] == 'sublinks': 
     continue 
    print bookmark_definition['name'] 
    for bookmark in bookmark_definition['bookmarks']: 
     print " * %(name)s: %(link)s" % bookmark 

# Get the sublink definition: 
sublinks = parsed_input['bookmark_collection']['sublinks'] 

# .. and print them 
print sublinks['name'] 
for link in sublinks['link']: 
    print ' *', link 
+0

Điều đáng chú ý về JSON là cú pháp của nó là CHÍNH XÁC giống như bạn sẽ sử dụng để tạo ra cùng một điều trong Python, xem xét "điều" như tự dictts lồng nhau và danh sách . – heltonbiker

+0

@heltonbiker: [Ngoại trừ trường hợp ngoại lệ] (http://stackoverflow.com/questions/6627635/is-json-syntax-a-strict-subset-of-python-syntax), tất nhiên. –

+0

wauv, bạn ngay lập tức làm cho tôi hiểu nó hoạt động như thế nào. cảm ơn bạn! Tại sao quá khó để tìm một ví dụ trên mạng ... –

0

Hmm, không json.loads làm thủ thuật?

Ví dụ, nếu dữ liệu của bạn trong một tập tin,

import json 
text = open('/tmp/mydata.json').read() 

d = json.loads(text) 

# first level fields 
print d['minutes'] # or 'secret' or 'link' 

# the names of each of bookmark_collections's items 
print d['bookmark_collection'].keys() 

# the sublinks section, as a dict 
print d['bookmark_collection']['sublinks'] 

Kết quả của mã này (cho đầu vào mẫu của bạn ở trên) là:

20 
[u'sublinks', u'free_link', u'boarding_pass'] 
{u'link': [u'http://www.1.com', u'http://www.2.com', u'http://www.3.com'], u'name': u'sublinks'} 

nào, tôi nghĩ, giúp bạn bạn cần gì

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