JSON ऑब्जेक्ट के माध्यम से Iterating


109

मैं डेटा, शीर्षक और लिंक आयात करने के लिए JSON ऑब्जेक्ट के माध्यम से पुनरावृति करने का प्रयास कर रहा हूं। मैं उस सामग्री को प्राप्त करने के लिए प्रतीत नहीं हो सकता है जो पिछले है :

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
    }
]

मैंने एक शब्दकोश का उपयोग करने की कोशिश की:

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

यह कोड केवल सूचना को पहले प्रिंट करता है :। ( जस्टिन बीबर ट्रैक को नजरअंदाज करें :))

जवाबों:


79

JSON डेटा का आपका लोडिंग थोड़ा नाजुक है। के बजाय:

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

आपको वास्तव में बस करना चाहिए:

json_object = json.load(raw)

आपको यह नहीं सोचना चाहिए कि आपको "JSON ऑब्जेक्ट" के रूप में क्या मिलता है। आपके पास क्या सूची है। सूची में दो डाइट हैं। डिकेट में विभिन्न कुंजी / मूल्य जोड़े होते हैं, सभी तार। जब आप करते हैं json_object[0], तो आप सूची में पहला तानाशाही के लिए पूछ रहे हैं। जब आप उस पर पुनरावृति करते हैं for song in json_object[0]:, तो आप तानाशाही की चाबी पर पुनरावृति करते हैं। क्योंकि यही वह चीज है जो आपको उस समय मिलती है जब आप तानाशाही पर चलते हैं। यदि आप उस तानाशाह में कुंजी के साथ जुड़े मूल्य का उपयोग करना चाहते हैं, तो आप उदाहरण के लिए, का उपयोग करेंगे json_object[0][song]

इनमें से कोई भी JSON के लिए विशिष्ट नहीं है। यह केवल मूल पायथन प्रकार है, किसी भी ट्यूटोरियल में उनके मूल संचालन के साथ।


मुझे नहीं मिला। मैंने आपके कहने के माध्यम से यह बताने की कोशिश की कि सीमा से बाहर क्या है। मुझे यकीन है कि इसके बारे में एक सवाल है json
myusuf3

7
नहीं, मैं आपको बता रहा हूं कि हुकुम पर चलने से आपको चाबी मिलती है। यदि आप किसी और चीज़ पर चलना चाहते हैं, तो आपको कुछ और चीज़ों पर चलना होगा। आपने यह नहीं कहा कि आप क्या करना चाहते हैं। एक पायथन ट्यूटोरियल यह पता लगाने के लिए एक अच्छी जगह होगी कि आप क्या कर सकते हैं, और यह क्या करेगा।
थॉमस वाउचर

5
दुर्भाग्य से यह उन सभी तरीकों की व्याख्या करने के लिए थोड़ा कठिन है जिन्हें आप सूचियों और शब्दकोशों से डेटा निकाल सकते हैं और एक टिप्पणी में आपके द्वारा डाले गए 600 वर्णों में तार हो सकते हैं। मैंने पहले ही कहा था कि आपको एक कुंजी के साथ जुड़े मूल्य पर प्राप्त करने के लिए तानाशाह को अनुक्रमित करना चाहिए। मुझे यकीन नहीं है कि आप क्या करना चाहते हैं। अंतर्निहित पायथन प्रकारों के बारे में सीखना अगला चरण है।
थॉमस वाउचर

जब आप अलग-अलग आइटम प्राप्त करना चाहते हैं तो इसमें बहुत अधिक चलना शामिल नहीं है। शायद आप जिस चीज पर ध्यान केंद्रित करना चाहते हैं json_object, वह है json_object[0], और फिर प्रत्येक हुकुम से अलग-अलग चीजें प्राप्त करना।
थॉमस वाउचर

101

मेरा मानना ​​है कि आप शायद मतलब है:

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: आप के song.iteritemsबजाय song.itemsअगर अजगर 2 में इस्तेमाल कर सकते हैं ।


विशेषता के लिए, song.iteritems () में मान: इस पंक्ति में अल्पविराम क्या दर्शाता है?
zakdances

यह वैसा ही है for (attribute, value) in song.iteritems():, (var1, var2) = (1, 2)या var1, var2 = 1, 2। जोड़े (टुपल्स) का dict.iteritems()निर्माण करता है (key, value)। "अजगर टपल अनपैकिंग" के लिए खोजें।
tzot

1
अजगर 3 के लिए, बदलने song.iteritemsके लिए song.items
बिग कद्दू

44

यह प्रश्न यहां एक लंबे समय से है, लेकिन मैं योगदान करना चाहता था कि मैं आमतौर पर एक JSON ऑब्जेक्ट के माध्यम से कैसे पुनरावृति करता हूं। नीचे दिए गए उदाहरण में, मैंने एक हार्ड-कोडेड स्ट्रिंग दिखाया है जिसमें JSON शामिल है, लेकिन JSON स्ट्रिंग आसानी से वेब सेवा या फ़ाइल से आ सकती है।

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
ऊपर दिए गए कोड में कोई स्ट्रिंग सबस्क्रिप्टिंग नहीं है; jsonObjectएक है dict। उपरोक्त कोड में, मैं पसंद करूंगा for key, value in jsonObject.items():
tzot

22

JSON को डिसेर्बलाइज़ करने के बाद, आपके पास एक पायथन ऑब्जेक्ट है। नियमित ऑब्जेक्ट विधियों का उपयोग करें।

इस मामले में आपके पास शब्दकोशों से बनी एक सूची है:

json_object[0].items()

json_object[0]["title"]

आदि।


8

मैं इस समस्या को इस तरह हल करूंगा

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

JSON के माध्यम से पुनरावृति के लिए आप इसका उपयोग कर सकते हैं:

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

पायथन 3 के लिए, आपको वेब सर्वर से वापस प्राप्त डेटा को डीकोड करना होगा। उदाहरण के लिए, मैं डेटा को utf8 के रूप में डिकोड करता हूं और फिर इससे निपटता हूं:

 # 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

यदि आप डीकोड नहीं करते हैं तो आपको पायथन 3 में बाइट्स बनाम स्ट्रिंग त्रुटियां मिलेंगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.