解析 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)
我正在尝试解析此数据(具体来自 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)