如何在Python中解析这个json

时间:2014-01-27 18:19:21

标签: python json parsing

我正在使用以这种格式输出数据的模块:

j = ("{u'auth_user': {u'first_name': u'a', u'last_name': u'b', u'uid': u'x', u'timezone_offset': u'7200', u'timezone': u'Europe', u'mail': u'x'}, u'server_time': 1390844912, u'table': {u'rows': [{u'c': [{u'v': u'20140126'}, {u'v': u'-35.9'}]}, {u'c': [{u'v': u'20140115'}, {u'v': u'-37.02'}]}, {u'c': [{u'v': u'20131222'}, {u'v': u'-48.1'}]}, {u'c': [{u'v': u'20131213'}, {u'v': u'-53.28'}]}, {u'c': [{u'v': u'20131209'}, {u'v': u'-26.8'}]}, {u'c': [{u'v': u'20131203'}, {u'v': u'-12.36'}]}], u'cols': [{u'type': u'date', u'label': u'date'}, {u'type': u'number', u'label': u'amount'}]}}")

我想从这些数据中提取负值。

我认为这是json,但我猜它可能无效。

我无法解析它。

json.loads(j)

返回:

ValueError: Expecting property name: line 1 column 2 (char 1) 

我该如何处理解析这些数据?如何从中提取负值?

2 个答案:

答案 0 :(得分:4)

它不是有效的JSON。如果有人发送给你声称它是JSON,你可以用棍子打它们。

这是一个有效的python dict文字,所以你可以使用:

import ast
ast.literal_eval(j) 

答案 1 :(得分:0)

正如wim所说,你可以使用ast.literal_eval来提取它们,因为它是有效的python literal

import ast
l = ast.literal_eval(j)

第二部分很有趣,因为你可以打印json以查看模式

import pprint
pprint.pprint(l)
{u'auth_user': {u'first_name': u'a',
                u'last_name': u'b',
                u'mail': u'x',
                u'timezone': u'Europe',
                u'timezone_offset': u'7200',
                u'uid': u'x'},
 u'server_time': 1390844912,
 u'table': {u'cols': [{u'label': u'date', u'type': u'date'},
                      {u'label': u'amount', u'type': u'number'}],
            u'rows': [{u'c': [{u'v': u'20140126'}, {u'v': u'-35.9'}]},
                      {u'c': [{u'v': u'20140115'}, {u'v': u'-37.02'}]},
                      {u'c': [{u'v': u'20131222'}, {u'v': u'-48.1'}]},
                      {u'c': [{u'v': u'20131213'}, {u'v': u'-53.28'}]},
                      {u'c': [{u'v': u'20131209'}, {u'v': u'-26.8'}]},
                      {u'c': [{u'v': u'20131203'}, {u'v': u'-12.36'}]}]}}

负值都在同一个地方,因此可以提取

print([cell[u'c'][1][u'v'] for cell in l[u'table'][u'rows']])
[u'-35.9', u'-37.02', u'-48.1', u'-53.28', u'-26.8', u'-12.36']