修复一个几乎有效的JSON文件

2024-05-01 21:56:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的问题如下。 我在数据中的一些地方看到uu'Category'u'Exp'以上。那到底是什么意思?你知道吗

如何将上述数据转换为有效的JSON?你知道吗


Tags: 数据jsonmessagedetailslongmswarncategory
2条回答

虽然它们看起来很相似,但实际上这不是JSON,而是Python对dict的表示(如果您打印它的话)。你知道吗

这是无效的原因有两个:

  1. 表示每个字符串前面的uunicode
  2. JSON中的键和值需要双引号,而不是单引号。你知道吗

假设在Python中有dict对象的表示形式,则应该通过JSON模块将其序列化为JSON:

import json

d = {u'x': 5}
print json.dumps(d)
> {"x": 5}  # notice the double-quotes

关于u的一些背景:

在Python2.x中,字符串是8位字符串类型或Unicode。为了区分两者,在Unicode字符串前面放一个u。在JSON中,字符串仅定义为“零个或多个Unicode字符的序列”。不需要区分不同的字符串类型。你知道吗

如果您在Python中有这个dict,并且您只想知道如何从中生成有效的JSON,那么您可以使用^{}模块来实现这一点。详见Martin Konecny's answer。你知道吗

另一方面,如果您在某个文件的某个地方有这个文本,并且已经来不及正确地存储它了,那么您只需要将它返回到dict中,唯一合理的方法是调用reprstr(或print)来逆转对Python对象调用^{}的效果。这只适用于那些只由一些非常基本的类型组成的东西……但这里似乎就是这样。你知道吗

同样,如果您没有更好的格式的数据,并且无法重新创建它,那么您应该这样做。但如果真是这样,就没有更好的选择了。你知道吗

例如,下面的程序将打印出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'])

相关问题 更多 >