使用来自ajax响应的嵌套值导航Python字典

时间:2014-05-02 17:58:41

标签: python ajax json dictionary python-2.x

我正在尝试访问一些嵌套为来自网站的ajax响应的值。

所有东西都输出为一条巨大的线,我无法向下导航。然而,为了让您了解它的外观,字典的pprint就像:

    {u'd': {u'Type': None,
    u'__type': u'TOPS.ajaxResponse',
    u'actionOnSuccess': None,
    u'data': u'{"BasicCodes":{"PRODUCTPRICES":[{"ProductId":"ProductA","CategoryId":"1","Color":"Red","Quantity":"0"},{"ProductId":"ProductA","CategoryId":"2","Color":"Blue","Quantity":"0"},{"ProductId":"ProductB","CategoryId":"1","Color":"Red","Quantity":"0"},{"ProductId":"ProductB","CategoryId":"2","Color":"Blue","Quantity":"0"}, ...and so on...

    .
    .
    .

    u'data2': None,
    u'dataExtra': None,
    u'errors': [],
    u'general_message': None,
    u'success': True}}

列出了数百种产品(ProductA,ProductB等),但我想要做的就是从ProductB,Color Blue等特定产品中获取与“Quantity”相关联的数字。

我使用

将响应加载为字典
    json_data = urllib2.urlopen('website')
    content = json_data.read()
    dictionary = json.loads(content)

dictionary.keys()仅输出'd'dictionary.values()输出除此之外的所有内容,包括u'success': True之类的内容,我希望这是一个单独的键/值组合。如果我尝试使用

向下导航字典
    print dictionary['d']['data']['BasicCodes']['PRODUCTPRICES'][0]['Quantity']

我收到TypeError: string indices must be integers的错误。

问题是我如何加载数据?或者我在导航键和值时错过了什么?

不确定它是否相关/相关,但输入时我也收到错误'unicode' object has no attribute 'values'

    dictionary['d']['data'].values()

我是Python的新手,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

因为这种工作在任何语言中都非常难(不仅仅是在Python中!)我创建了ObjectPath查询语言,使得使用JSON文档变得轻而易举:

Python方式:

$ sudo pip install objectpath
$ python
>>> from objectpath import *
>>> with open('test1.json') as f:
...    j = json.load(f)
>>> tree=Tree(j)
>>> tree.execute("$..PRODUCTPRICES[@.ProductId is "ProductA" and @.Color is "Blue"].Quantity")
[u'0']

控制台方式

git clone https://github.com/adriank/ObjectPath.git
cd ObjectPath/ObjectPathPy
python objectpath file.json
(or python objectpath -u URL)
>>> $..PRODUCTPRICES[@.ProductId is "ProductA" and @.Color is "Blue"].Quantity
[0]

你可以用这种语言做更多的事情!它就像SQL for JSON(以及其他复杂的数据结构)。更多信息:http://adriank.github.io/ObjectPath/