迭代 JSON 对象

问题描述 投票:0回答:10

我正在尝试迭代 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

此代码仅打印

:
之前的信息。 (忽略贾斯汀·比伯的曲目:))

python dictionary loops
10个回答
165
投票

我相信你的意思可能是:

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

注意:如果在 Python 2 中,您可以使用

song.iteritems
代替
song.items


113
投票

您加载的 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 特有的。这只是基本的 Python 类型,其基本操作在任何教程中都有介绍。


62
投票

这个问题已经存在很长时间了,但我想贡献一下我通常如何迭代 JSON 对象。 在下面的示例中,我展示了一个包含 JSON 的硬编码字符串,但 JSON 字符串也可以轻松来自 Web 服务或文件。

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()

30
投票

反序列化 JSON 后,你就有了一个 python 对象。使用常规对象方法。

在本例中,您有一个由字典组成的列表:

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

5
投票

对于 Python 3,您必须解码从 Web 服务器返回的数据。例如我将数据解码为 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

如果不解码,Python 3 中将出现字节与字符串错误。


4
投票

要迭代 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'])

1
投票

添加另一个解决方案(Python 3) - 迭代目录中的 json 文件,并在每个文件上迭代所有对象并打印相关字段。

请参阅代码中的注释。

import os,json

data_path = '/path/to/your/json/files'  

# 1. Iterate over directory
directory = os.fsencode(data_path)
for file in os.listdir(directory):
    filename = os.fsdecode(file)
    # 2. Take only json files
    if filename.endswith(".json"):
        file_full_path=data_path+filename
        # 3. Open json file 
        with open(file_full_path, encoding='utf-8', errors='ignore') as json_data:
            data_in_file = json.load(json_data, strict=False)
            # 4. Iterate over objects and print relevant fields
            for json_object in data_in_file:
                print("ttl: %s, desc: %s" % (json_object['title'],json_object['description']) )

0
投票

如果可以将json字符串存储在变量中

jsn_string

import json

jsn_list = json.loads(json.dumps(jsn_string)) 
   for lis in jsn_list:
       for key,val in lis.items():
           print(key, val)

输出:

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);
http://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

0
投票

您也可以使用 pandas:

import pandas as pd

# Load json file
jsonlist = pd.read_json("listfile.json") # your json file
jsonlist.head()

# Loop process
for key in jsonlist:
   print(jsonlist['title'], jsonlist['description')

© www.soinside.com 2019 - 2024. All rights reserved.