【问题标题】:Error in json.loads() for data that has base64 decoding applied对于应用了 base64 解码的数据,json.loads() 中的错误
【发布时间】:2018-06-05 06:56:08
【问题描述】:

我正在尝试在 python 中使用 json.loads()

我得到错误:

JSON 对象必须是 str,而不是 'bytes'

a = {'h': '123', 'w': '12345', 'data': "b'eyJod2lkIjpwomfcwpvepovnepovqrepniLLKJAMSNDMSNDMAWEFMOEDAad='"}


a.update(json.loads(base64.b64decode(a['data'])))

这里 a 的“数据”部分被加载为带有 b64 编码的 json 转储。

'data':base64.b64encode(json.dumps(test).encode()); where test = some string eg('epovqrepniLLKJAMSNDMSNDMAWEFMOEDAad=')

我尝试过使用:

a.update(json.loads(base64.b64decode(a['data']).decode('utf-8')))

给我一​​个 'utf-8' 编解码器无法解码位置字节:无效的继续字节

我也尝试过使用 decodebytes 而不是 b64decode 无济于事。

非常感谢任何帮助!

【问题讨论】:

  • 你不需要json.loads(data=a) 因为它已经是一个python dict,你只需要直接输出这个dict。从 dict 输出 json 字符串是 json.dumps() 的工作
  • data 值看起来很损坏。你知道"b'eyJ... 在用 JSON 和 B64 编码之前是什么吗?通过删除外部引号并将b64decode 应用于字节字符串b'eyJ...',我得到了开头看起来像JSON(b'{"hwid":)的东西,但其余部分显然不是有效的JSON。
  • @lenz 你是对的,这些是虚拟值。实际编码数据是有效的。我需要能够删除字典中的外引号。然而,我无法使用 json,即使我使用了 b64decode
  • 请显示一些实际(可能是缩写)值,以便测试恢复策略。
  • @lenz 道歉。有敏感数据,我不能放在这里。

标签: python json utf-8 base64 decoding


【解决方案1】:

感谢大家的帮助。

在 Stackoverflow 上进行大量搜索并在我的本地机器上进行测试后,我得以深入了解这一点。

传入的对象(a['data']) 有一些值不是utf-8 可解码的。

格式为b'xxxsknoen'

我最终删除了前面和结尾的 b 和引号,然后将其转换为 str。

var = base64.b64decode(str(a['data'])[2:-1]).decode('utf-8')
a.update(json.loads(var))

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2021-07-11
    相关资源
    最近更新 更多