我有以下JSON数据。(它不是完全有效的数据。但它几乎有效)
{
u'Category': u'Exp',
u'Severity': u'warn',
u'EventName': u'TimeExceeded',
u'EventTimestamp': u'1432510367083',
u'Message': u'details: {
"Message": "long (2567 ms : ATime: 5 ms, BTime: 1237 ms, CTime: 1325 ms)",
"Title": "Core Herald influence",
"Referrer": "undefined",
"Time": "Mon May 25 2015 11:32:47 GMT+1200 (NZST)",
"Session": "None",
"ResponseTime": 0,
"StatusCode": 0,
"Links": 325,
"Images": 57,
"Forms": 2,
"Errors": 0,
"Platform": "Linux x86_64",
"BrowserAppname": "Netscape",
"AppCodename": "Mozilla",
"Product": "Gecko",
"CPUs": 8,
"Language": "en-GB",
}',
u'Subject': u'TimeExceeded'
}
我的问题如下。
我在数据中的几个地方看到u
上面有u'Category'
和u'Exp'
。这些意味着什么?
如何将上述数据转换为有效的JSON?
答案 0 :(得分:7)
虽然它们看起来很相似,但实际上这不是JSON,而是如果你打印它就是Python的dict表示。
这有两个原因无效:
u
的{{1}} 假设您在Python中有unicode
对象的表示,您应该通过json模块将其序列化为JSON:
dict
import json
d = {u'x': 5}
print json.dumps(d)
> {"x": 5} # notice the double-quotes
上的一些背景信息:
在Python 2.x中,字符串是8位字符串类型或Unicode。为了区分这两者,u
放在Unicode字符串的前面。在JSON中,字符串仅被定义为"零个或多个Unicode字符的序列"。无需区分不同的字符串类型。
答案 1 :(得分:2)
如果您在Python中实际拥有此dict
,并且您只想知道如何从中生成有效的JSON,那么您可以使用json
模块执行此操作。有关详细信息,请参阅Martin Konecny's answer。
另一方面,如果你在某个文件中有这个文本,并且将它正确存储为时已晚,你只需要将它恢复为dict
,这是扭转这个问题的唯一合理方法。在Python对象上调用repr
或str
(或只是print
)的效果是调用literal_eval
。只有当你print
编辑的东西只是由一些非常基本的类型构成时才有效......但这似乎就是这种情况。
同样,如果您没有更好格式的数据,并且无法重新创建数据,则仅执行此操作。但如果是这样的话,那就没有更好的选择了。
因此,例如,以下程序将打印出TimeExceeded
:
import ast
not_json = """
{
u'Category': u'Exp',
u'Severity': u'warn',
# ... [snip] ...
u'Subject': u'TimeExceeded'
}
"""
d = ast.literal_eval(not_json)
print(d[u'Subject'])