【问题标题】:Parsing JSON failed解析 JSON 失败
【发布时间】:2015-04-14 12:11:35
【问题描述】:

我正在尝试解析这些数据(专门来自 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! 

【问题讨论】:

  • 您使用什么库来解析响应?会不会是请求
  • 是的——我用“r.content”获取数据——也试过“r.text”和“r.json”
  • print r.json() 是否给您任何错误?
  • 你真的不需要去掉[ ]或者使用eval(),json可以是list(嗯array)或字典。请看我的回答。

标签: python json viper


【解决方案1】:

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

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

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

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

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

result = eval(data)

或者更安全:

result = ast.literal_eval(data)

【讨论】:

  • 你用什么来解析数据?
【解决方案2】:

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

此外,在 JSON 中,结构以“[”或“{”(通常为“{”)开头,而不是两者。

【讨论】:

  • 就是这样!!谢谢!虽然现在如果我在对象上做一个“类型”它是一个列表..不是一个字典
  • 原来是一本字典的列表,d = parsed[0]
  • 这是真的,但类型是“str”而不是“list”——知道如何简单地将字符串创建到列表中吗?
【解决方案3】:

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

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

json.loads(resp)

【讨论】:

    猜你喜欢
    • 2016-05-31
    • 2015-10-05
    • 2015-10-19
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多