Lặp lại thông qua một đối tượng JSON


109

Tôi đang cố gắng lặp qua một đối tượng JSON để nhập dữ liệu, tức là tiêu đề và liên kết. Tôi dường như không thể truy cập vào nội dung đã qua :.

JSON:

[
    {
        "title": "Baby (Feat. Ludacris) - Justin Bieber",
        "description": "Baby (Feat. Ludacris) by Justin Bieber on Grooveshark",
        "link": "http://listen.grooveshark.com/s/Baby+Feat+Ludacris+/2Bqvdq",
        "pubDate": "Wed, 28 Apr 2010 02:37:53 -0400",
        "pubTime": 1272436673,
        "TinyLink": "http://tinysong.com/d3wI",
        "SongID": "24447862",
        "SongName": "Baby (Feat. Ludacris)",
        "ArtistID": "1118876",
        "ArtistName": "Justin Bieber",
        "AlbumID": "4104002",
        "AlbumName": "My World (Part II);\nhttp://tinysong.com/gQsw",
        "LongLink": "11578982",
        "GroovesharkLink": "11578982",
        "Link": "http://tinysong.com/d3wI"
    },
    {
        "title": "Feel Good Inc - Gorillaz",
        "description": "Feel Good Inc by Gorillaz on Grooveshark",
        "link": "http://listen.grooveshark.com/s/Feel+Good+Inc/1UksmI",
        "pubDate": "Wed, 28 Apr 2010 02:25:30 -0400",
        "pubTime": 1272435930
    }
]

Tôi đã thử sử dụng từ điển:

def getLastSong(user,limit):
    base_url = 'http://gsuser.com/lastSong/'
    user_url = base_url + str(user) + '/' + str(limit) + "/"
    raw = urllib.urlopen(user_url)
    json_raw= raw.readlines()
    json_object = json.loads(json_raw[0])

    #filtering and making it look good.
    gsongs = []
    print json_object
    for song in json_object[0]:   
        print song

Mã này chỉ in thông tin trước đó :. ( bỏ qua bài hát của Justin Bieber :))

Câu trả lời:


79

Việc tải dữ liệu JSON của bạn hơi mong manh. Thay vì:

json_raw= raw.readlines()
json_object = json.loads(json_raw[0])

bạn thực sự chỉ nên làm:

json_object = json.load(raw)

Bạn không nên nghĩ những gì bạn nhận được là một "đối tượng JSON". Những gì bạn có là một danh sách. Danh sách có hai phần. Các phần chứa các cặp khóa / giá trị khác nhau, tất cả các chuỗi. Khi bạn làm vậy json_object[0], bạn đang yêu cầu câu chính tả đầu tiên trong danh sách. Khi bạn lặp lại điều đó, với for song in json_object[0]:, bạn sẽ lặp lại các phím của mệnh lệnh. Bởi vì đó là những gì bạn nhận được khi bạn lặp lại câu lệnh. Ví dụ: nếu bạn muốn truy cập giá trị được liên kết với khóa trong mệnh lệnh đó, bạn sẽ sử dụng json_object[0][song].

Không có điều nào trong số này là cụ thể cho JSON. Nó chỉ là các loại Python cơ bản, với các hoạt động cơ bản của chúng như được đề cập trong bất kỳ hướng dẫn nào.


tôi không hiểu. tôi đã cố gắng lặp lại những gì câu nói của bạn nói ra ngoài giới hạn. tôi khá chắc chắn là một câu hỏi của nó về json
myusuf3

7
Không. Tôi đang nói với bạn rằng việc lặp lại câu lệnh sẽ mang lại cho bạn chìa khóa. Nếu bạn muốn lặp lại một thứ khác, bạn sẽ phải lặp lại một thứ khác. Bạn đã không nói những gì bạn muốn lặp lại. Một hướng dẫn Python sẽ là một nơi tốt để tìm hiểu những gì bạn có thể lặp lại và những gì nó sẽ làm.
Thomas Wouters

5
Thật không may, hơi khó để giải thích tất cả các cách bạn có thể trích xuất dữ liệu từ danh sách và từ điển và các chuỗi ký tự trong 600 ký tự mà bạn có thể đưa vào nhận xét. Tôi đã nói rằng bạn nên lập chỉ mục dict để lấy giá trị được liên kết với một khóa. Tôi không chắc bạn muốn lặp lại những gì. Tìm hiểu về các loại Python tích hợp là bước tiếp theo.
Thomas Wouters

Không có nhiều sự lặp lại liên quan khi bạn muốn nhận các vật phẩm riêng lẻ. Có lẽ những gì bạn muốn lặp lại là json_object, không phải json_object[0]và sau đó nhận các mục riêng lẻ từ mỗi câu lệnh.
Thomas Wouters

101

Tôi tin rằng bạn có thể muốn nói:

from __future__ import print_function

for song in json_object:
    # now song is a dictionary
    for attribute, value in song.items():
        print(attribute, value) # example usage

NB: Bạn có thể sử dụng song.iteritemsthay vì song.itemsif trong Python 2.


cho thuộc tính, giá trị trong song.iteritems (): dấu phẩy ở dòng này biểu thị điều gì?
zakdances

Nó giống như for (attribute, value) in song.iteritems():, hoặc (var1, var2) = (1, 2)hoặc var1, var2 = 1, 2. dict.iteritems()tạo ra (key, value)các cặp (bộ giá trị). Tìm kiếm “giải nén tuple python”.
tzot

1
Đối với python 3, hãy thay đổi song.iteritemsthành song.items.
Big Pumpkin

44

Câu hỏi này đã được đưa ra ở đây từ lâu, nhưng tôi muốn đóng góp cách tôi thường lặp lại thông qua một đối tượng JSON. Trong ví dụ dưới đây, tôi đã chỉ ra một chuỗi được mã hóa cứng có chứa JSON, nhưng chuỗi JSON có thể dễ dàng đến từ một dịch vụ web hoặc một tệp.

import json

def main():

    # create a simple JSON array
    jsonString = '{"key1":"value1","key2":"value2","key3":"value3"}'

    # change the JSON string into a JSON object
    jsonObject = json.loads(jsonString)

    # print the keys and values
    for key in jsonObject:
        value = jsonObject[key]
        print("The key and value are ({}) = ({})".format(key, value))

    pass

if __name__ == '__main__':
    main()

2
Không có chỉ số chuỗi trong đoạn mã trên; jsonObjectlà một dict. Trong đoạn mã trên, tôi thích for key, value in jsonObject.items():.
tzot

22

Sau khi giải nén JSON, bạn có một đối tượng python. Sử dụng các phương thức đối tượng thông thường.

Trong trường hợp này, bạn có một danh sách gồm các từ điển:

json_object[0].items()

json_object[0]["title"]

Vân vân.


8

Tôi sẽ giải quyết vấn đề này nhiều hơn như thế này

import json
import urllib2

def last_song(user, limit):
    # Assembling strings with "foo" + str(bar) + "baz" + ... generally isn't 
    # as nice as using real string formatting. It can seem simpler at first, 
    # but leaves you less happy in the long run.
    url = 'http://gsuser.com/lastSong/%s/%d/' % (user, limit)

    # urllib.urlopen is deprecated in favour of urllib2.urlopen
    site = urllib2.urlopen(url)

    # The json module has a function load for loading from file-like objects, 
    # like the one you get from `urllib2.urlopen`. You don't need to turn 
    # your data into a string and use loads and you definitely don't need to 
    # use readlines or readline (there is seldom if ever reason to use a 
    # file-like object's readline(s) methods.)
    songs = json.load(site)

    # I don't know why "lastSong" stuff returns something like this, but 
    # your json thing was a JSON array of two JSON objects. This will 
    # deserialise as a list of two dicts, with each item representing 
    # each of those two songs.
    #
    # Since each of the songs is represented by a dict, it will iterate 
    # over its keys (like any other Python dict). 
    baby, feel_good = songs

    # Rather than printing in a function, it's usually better to 
    # return the string then let the caller do whatever with it. 
    # You said you wanted to make the output pretty but you didn't 
    # mention *how*, so here's an example of a prettyish representation
    # from the song information given.
    return "%(SongName)s by %(ArtistName)s - listen at %(link)s" % baby

3

để lặp qua JSON, bạn có thể sử dụng cái này:

json_object = json.loads(json_file)
for element in json_object: 
    for value in json_object['Name_OF_YOUR_KEY/ELEMENT']:
        print(json_object['Name_OF_YOUR_KEY/ELEMENT']['INDEX_OF_VALUE']['VALUE'])

2

Đối với Python 3, bạn phải giải mã dữ liệu bạn lấy lại từ máy chủ web. Ví dụ: tôi giải mã dữ liệu dưới dạng utf8 sau đó xử lý nó:

 # example of json data object group with two values of key id
jsonstufftest = '{'group':{'id':'2','id':'3'}}
 # always set your headers
headers = {'User-Agent': 'Moz & Woz'}
 # the url you are trying to load and get json from
url = 'http://www.cooljson.com/cooljson.json'
 # in python 3 you can build the request using request.Request
req = urllib.request.Request(url,None,headers)
 # try to connect or fail gracefully
try:
    response = urllib.request.urlopen(req) # new python 3 code -jc
except:
    exit('could not load page, check connection')
 # read the response and DECODE
html=response.read().decode('utf8') # new python3 code
 # now convert the decoded string into real JSON
loadedjson = json.loads(html)
 # print to make sure it worked
print (loadedjson) # works like a charm
 # iterate through each key value
for testdata in loadedjson['group']:
    print (accesscount['id']) # should print 2 then 3 if using test json

Nếu bạn không giải mã, bạn sẽ nhận được lỗi byte so với chuỗi trong Python 3.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.