解析 JSON 失败

Parsing JSON failed

我正在尝试解析此数据(具体来自 Viper 恶意软件分析框架 API)。我很难找出最好的方法来做到这一点。理想情况下,我会做一个:

jsonObject.get("SSdeep")

...我会得到值。

不幸的是,我不认为这是有效的 JSON,并且在不编辑项目源的情况下,我怎样才能使它正确 JSON 或轻松获得这些值?

[{
'data': {
    'header': ['Key', 'Value'],
    'rows': [
        ['Name', u 'splwow64.exe'],
        ['Tags', ''],
        ['Path', '/home/ubuntu/viper-master/projects/../binaries/8/e/e/5/8ee5b228bd78781aa4e6b2e15e965e24d21f791d35b1eccebd160693ba781781'],
        ['Size', 125952],
        ['Type', 'PE32+ executable (GUI) x86-64, for MS Windows'],
        ['Mime', 'application/x-dosexec'],
        ['MD5', '4b1d2cba1367a7b99d51b1295b3a1d57'],
        ['SHA1', 'caf8382df0dcb6e9fb51a5e277685b540632bf18'],
        ['SHA256', '8ee5b228bd78781aa4e6b2e15e965e24d21f791d35b1eccebd160693ba781781'],
        ['SHA512', '709ca98bfc0379648bd686148853116cabc0b13d89492c8a0fa2596e50f7e4d384e5c359081a90f893d8d250cfa537193cbaa1c53186f29c0b6dedeb50d53d4d'],
        ['SSdeep', ''],
        ['CRC32', '7106095E']
    ]
},
'type': 'table'
}]

编辑 1 谢谢!所以我试过这个:

        jsonObject = r.content.replace("'", "\"")
        jsonObject = jsonObject.replace(" u", "")

我现在的输出是:

"[{"data": {"header": ["Key", "Value"], "rows": [["Name","splwow64.exe"], ["Tags", ""], ["Path", "/home/ubuntu/viper-master/projects/../binaries/8/e/e/5/8ee5b228bd78781aa4e6b2e15e965e24d21f791d35b1eccebd160693ba781781"], ["Size", 125952], ["Type", "PE32+ executable (GUI) x86-64, for MS Windows"], ["Mime", "application/x-dosexec"], ["MD5", "4b1d2cba1367a7b99d51b1295b3a1d57"], ["SHA1", "caf8382df0dcb6e9fb51a5e277685b540632bf18"], ["SHA256", "8ee5b228bd78781aa4e6b2e15e965e24d21f791d35b1eccebd160693ba781781"], ["SHA512", "709ca98bfc0379648bd686148853116cabc0b13d89492c8a0fa2596e50f7e4d384e5c359081a90f893d8d250cfa537193cbaa1c53186f29c0b6dedeb50d53d4d"], ["SSdeep", ""], ["CRC32", "7106095E"]]}, "type": "table"}]"

现在我收到这个错误:

  File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 1 column 5 - line 1 column 716 (char 4 - 715)

注意:我真的不想那样做查找和替换..尤其是“u”,因为这可能会产生意想不到的后果。

编辑 2: 弄清楚了!谢谢大家!

这是我最后做的,因为有人提到来自服务器的原始文本是 "list of dicts":

        r = requests.post(url, data=data) #Make the server request
        listObject = r.content #Grab the content (don't really need this line)
        listObject = listObject[1:-1] #Get rid of the quotes 
        listObject = ast.literal_eval(listObject) #Create a list out of the literal characters of the string
        dictObject = listObject[0] #My dict! 

JSON 为字符串指定双引号 "s,来自 JSON standard

A value can be a string in double quotes, or a number, or true or false or null, or an object or an array.

因此您需要将所有单引号替换为双引号:

data.replace("'", '"')

Name 字段中还有一个虚假的 u 需要删除。
但是,如果数据有效 Python 并且您信任它,您可以尝试对其进行评估,这适用于您的原始数据(在 u 之后没有 space):

result = eval(data)

或更安全:

result = ast.literal_eval(data)

现在您似乎对整件事都进行了引号 "wrapping"。这导致所有括号都是字符串。删除 JSON.

开头和结尾的引号

此外,在 JSON 中,结构以“[”或“{”(通常是“{”)开始,不能同时使用两者。

无需使用eval(),只需替换格式错误的字符(使用转义\字符)并用json解析即可:

resp = r.content.replace(" u \'", " \'").replace("\'", "\"")

json.loads(resp)