修复几乎有效的JSON文件

时间:2015-05-24 23:41:11

标签: python json

我有以下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?

2 个答案:

答案 0 :(得分:7)

虽然它们看起来很相似,但实际上这不是JSON,而是如果你打印它就是Python的dict表示。

这有两个原因无效:

  1. 在每个字符串前面代表u的{​​{1}}
  2. 您需要在密钥和JSON值中使用双引号,而不是单引号。
  3. 假设您在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对象上调用reprstr(或只是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'])