0

我正在尝试解析这些数据(专门来自 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: 想通了!谢谢大家!

这是我最终做的事情,因为有人提到服务器的原始文本是“字典列表”:

        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! 
4

3 回答 3

1

现在你似乎有引号“包裹”了整个事情。这导致所有括号都是字符串。删除 JSON 开头和结尾的引号。

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

于 2015-04-14T00:21:12.003 回答
1

"JSON为字符串指定双引号,来自JSON 标准

值可以是双引号中的字符串、数字、true 或 false 或 null,也可以是对象或数组。

所以你需要用双引号替换所有单引号:

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

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

result = eval(data)

或者更安全:

result = ast.literal_eval(data)
于 2015-04-14T00:04:11.310 回答
0

不需要使用eval(),只需替换格式错误的字符(使用转义\字符)并解析它就json可以了:

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

json.loads(resp)
于 2015-04-14T00:36:37.100 回答