একটি JSON অবজেক্টের মাধ্যমে আইট্রেট করা


109

আমি ডেটা আমদানি করার জন্য একটি জেএসওএন অবজেক্টের মাধ্যমে পুনরাবৃত্তি করার চেষ্টা করছি, অর্থ শিরোনাম এবং লিঙ্ক। আমি অতীতের যে সামগ্রীটি পেয়েছি তা দেখতে পাচ্ছি না :

তাদেরকে 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

এই কোডটি কেবল আগে তথ্য মুদ্রণ করে :। ( জাস্টিন বিবার ট্র্যাক উপেক্ষা করুন :))

উত্তর:


78

আপনার JSON ডেটা লোড করা কিছুটা নাজুক। পরিবর্তে:

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

আপনার সত্যই ঠিক করা উচিত:

json_object = json.load(raw)

"জেএসএন অবজেক্ট" হিসাবে আপনি কী পাবেন সে সম্পর্কে আপনার ভাবা উচিত নয়। আপনার যা আছে তা একটি তালিকা। তালিকায় দুটি ডিক্ট রয়েছে। ডিক্টসে বিভিন্ন কী / মান জোড়া, সমস্ত স্ট্রিং থাকে। আপনি যখন করবেন json_object[0], আপনি তালিকার প্রথম ডিকের জন্য জিজ্ঞাসা করছেন। আপনি যখন এটির সাথে for song in json_object[0]:পুনরাবৃত্তি করেন, আপনি ডকের কীগুলি দিয়ে পুনরাবৃত্তি করেন। কারণ আপনি ডিকের উপর পুনরাবৃত্তি যখন আপনি কি পাবেন। আপনি যদি সেই ডিকের কীটির সাথে যুক্ত মানটি অ্যাক্সেস করতে চান তবে উদাহরণস্বরূপ, আপনি ব্যবহার করবেন json_object[0][song]

এর কোনটিই জেএসএনের সাথে সুনির্দিষ্ট নয়। এটি কেবলমাত্র পাইথন ধরণের টাইপস, যেকোন টিউটোরিয়ালে আচ্ছাদিত তাদের বেসিক ক্রিয়াকলাপগুলি সহ।


আমি এটা পেলাম না আপনার বক্তব্য সীমা ছাড়িয়ে যা বলে আমি তা পুনরুক্ত করার চেষ্টা করেছি। আমি নিশ্চিত যে এটি
জাসন

7
না। আমি আপনাকে বলছি যে ডিকের মাধ্যমে পুনরাবৃত্তি আপনাকে কীগুলি দেয়। আপনি যদি অন্য কোনও কিছুর উপরে পুনরাবৃত্তি করতে চান তবে আপনাকে অন্য কোনও কারণে পুনরাবৃত্তি করতে হবে। আপনি কী পুনরাবৃত্তি করতে চান তা বলেন নি। আপনি কী পুনরাবৃত্তি করতে পারবেন এবং এটি কী করবে তা খুঁজে পাওয়ার জন্য পাইথন টিউটোরিয়ালটি ভাল জায়গা হবে।
থমাস ওয়াউটারস

5
দুর্ভাগ্যক্রমে আপনি যে মন্তব্যগুলিতে মন্তব্য করতে পারেন তার মধ্যে and০০ টি অক্ষরের তালিকা এবং অভিধান এবং স্ট্রিং থেকে ডেটা আহরণ করতে পারে এমন সমস্ত উপায় ব্যাখ্যা করা কিছুটা শক্ত। আমি ইতিমধ্যে বলেছি যে কীটির সাথে যুক্ত মানটি পেতে আপনার ডিকটি সূচি করা উচিত। আপনি কী পুনরাবৃত্তি করতে চান তা আমি নিশ্চিত নই। অন্তর্নির্মিত পাইথন প্রকারগুলি সম্পর্কে শিখানো পরবর্তী পদক্ষেপ।
থমাস ওয়াউটারস

আপনি পৃথক আইটেম পেতে চাইলে খুব বেশি পুনরাবৃত্তি জড়িত থাকে না। সম্ভবত আপনি যা পুনরাবৃত্তি করতে চান তা হ'ল 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

এনবি: পাইথন 2 এ song.iteritemsপরিবর্তে আপনি ব্যবহার করতে পারেন song.items


গুন.সাইটাইটেমগুলিতে মান (): বৈশিষ্ট্যের জন্য, এই লাইনে কমাটি কী বোঝায়?
জাকদানস

এটা তোলে হিসাবে একই for (attribute, value) in song.iteritems():, বা (var1, var2) = (1, 2)বা var1, var2 = 1, 2। জোড়া dict.iteritems()উত্পাদন (key, value)(tuples)। "পাইথন টিপল আনপ্যাকিং" অনুসন্ধান করুন।
tzot

1
অজগর 3 এর জন্য, এ পরিবর্তন song.iteritemsকরুন song.items
বড় কুমড়ো

44

এই প্রশ্নটি এখানে দীর্ঘ সময় চলে আসছিল, তবে আমি কীভাবে জেএসএন কোনও জিনিসের মাধ্যমে সাধারণত পুনরাবৃত্তি করব তা অবদান রাখতে চেয়েছিলাম। নীচের উদাহরণে, আমি একটি হার্ড-কোডেড স্ট্রিং দেখিয়েছি যার মধ্যে জেএসওএন রয়েছে, তবে জেএসএন স্ট্রিংটি সহজেই ওয়েব পরিষেবা বা কোনও ফাইল থেকে আসতে পারে।

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_object[0].items()

json_object[0]["title"]

প্রভৃতি


8

আমি এই সমস্যাটির মতো আরও সমাধান করব solve

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 এর জন্য আপনাকে ওয়েব সার্ভার থেকে ফিরে আসা ডেটাটি ডিকোড করতে হবে। উদাহরণস্বরূপ, আমি ডেটাটি ইউটিএফ 8 হিসাবে ডিকোড করে তার সাথে ডিল করি:

 # 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 এ আপনি বাইট বনাম স্ট্রিং ত্রুটি পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.