按键值对 JSON 数据进行排序

Posted

技术标签:

【中文标题】按键值对 JSON 数据进行排序【英文标题】:Sorting JSON data by keys value 【发布时间】:2012-11-06 11:25:35 【问题描述】:

我目前正在从 discogs API(mp3 标签数据)获取 JSON 数据,并希望按键的值对结果进行排序。在这种情况下,我试图获取 Guns n Roses 歌曲的数据,输出的第一个是 1988 年,而数据实际上有 1987 年的记录。如何对这些数据进行排序,以便我可以通过年(从旧到新)。下面的代码按键或值排序,但这不是我想要得到的。请帮忙。

import json
import urllib2
request = urllib2.Request('http://api.discogs.com/database/search?sort=year&sort_order=asc&artist=%22Guns+N%27+Roses%22&track=%22Sweet+Child+O%27+Mine%22&format_exact=Album&type=master')
request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
request.add_header('Content-Type','application/json')
response = urllib2.urlopen(request)
json_raw= response.readlines()
json_object = json.loads(json_raw[0])



for row in json_object['results']:
    try:
        from operator import itemgetter
        for k, v in sorted(row.items(), key=itemgetter(0)):
            print k, v
    except KeyError: 
        pass

【问题讨论】:

如果您提供 JSON 数据样本,我会提供帮助。 从外观上看,您使用的是this API。 【参考方案1】:

您可以为此使用 list-comprehension 和 sorted() 函数:

# filter  json_object['results']  first, as some of the items are missing the key 'year'

In [33]: results = [x for x in json_object['results'] if 'year' in x]

In [34]: sorted(results, key=lambda x: x['year'])

或:

In [79]: from operator import itemgetter

In [80]: sorted(results, key=itemgetter('year'))

【讨论】:

比你,这就像一个魅力,正如你所知,我是一个新手,还有很长的路要走..【参考方案2】:

要对字典列表进行排序,请使用methodcaller 和要排序的键;您想对 results 列表进行排序,而不是对包含的字典进行排序。此外,有些条目没有一年,这可能会导致错误:

from operator import methodcaller

for row in sorted(json_object['results'], key=methodcaller('get', 'year', None)):
    # process the row dictionary

methodcaller 定义基本上将为json_object['results'] 中的每个条目执行entry.get('year', None),为sorted 方法提供排序值。

您应该使用readlines() 来读取您的 JSON 响应,它会误解换行符。让json 图书馆代替阅读(注意.load(),最后没有s):

response = urllib2.urlopen(request)
json_object = json.load(response)

【讨论】:

我是这个论坛的新手,我无法发布 JSON,因为它说我还剩几个字符要发布... 查看How do I format my code blocks? 以获得更多帮助。 我不确定我做错了什么,但是当我现在运行这个时,我得到一个错误: C:\Python27>python test2.py Traceback(最近一次调用最后):文件“test2.py”,第 11 行,在 中的行中排序(json_object['results'] , key=itemgetter('year')): KeyError: 'year' @PremMinister:我对代码进行了更多测试,并进行了更新。实际上,我改变了一些技巧。

以上是关于按键值对 JSON 数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

更好列表页中一个航班.先unset删除数组中一个键值对,再追加,最后按键排序

按多个键值对数据进行排序

如何通过 jq 中这些键的键和值对 json 文件进行排序

java 怎么样获取Map中第几个键值对

如何先按值对 std::map 排序,然后按键排序?

在Java中按键或值对地图进行排序[重复]