【问题标题】:Python List to JSONPython 列表转 JSON
【发布时间】:2019-01-13 17:25:51
【问题描述】:

我正在尝试将返回列表的函数的输出转换为 JSON 对象。

函数输出如下列表 = [b'E28011600000208', b'E28023232083', b'3000948484']

我想创建一个具有以下属性的 JSON 对象:

{"tag": ["E28011600000208", "E28023232083", "3000948484"]}

类似示例中未显示列表项的解码,如果这是解决此问题的方法,我需要帮助。

我调用的函数如下:

reader.read(timeout=500)

执行同步读取,然后返回搜索结果的 TagReadData 对象列表。如果没有找到标签,则列表将为空。

例如:

print(reader.read())
[b'E2002047381502180820C296', b'0000000000000000C0002403']

在我的代码中,我做了以下事情:

tags = reader.read()
data = json.dumps({tag: tags}, separator=(',','b'))
print (data)

我得到错误: raise TypeError(repr(o) + "不是 JSON 可序列化") TypeError: b'3000948484' 不是 JSON 可序列化的

我尝试了下面的解决方案来删除字节串我的代码如下:

tags = reader.read()
tags = list(map(lambda x:x.decode('utf-8'),tags))
data = json.dumps({'tag':tags})
print(data)

我得到错误: AttributeError: 'mercury.TagReadData' 对象没有属性 'decode'

现在的输出是 JSON,但我的 JSON 文件中仍然有 b' 字符串。我有以下代码:

tag = list(map(lambda x: str(x), tag))
data = json.dumps({'tag': tag})
print(data)

代码输出如下:

{"tag": ["b'30000000321'", "b'300000000'"]}

如何删除 b?通过在 python 3.5 中执行 str(x) ,它应该解码字节,但它没有。

【问题讨论】:

  • 要获取的json无效,使用jsonlint.com
  • Python 字典键应该是唯一的。为什么不把 tag 作为键和值作为列表
  • 当然,即使那样我如何将python输入转换为那种类型的JSON结构@MaNKuR
  • @esqew 列表对象没有解码属性,我将如何解码列表中的 b?

标签: python json


【解决方案1】:

Python dict 应该有唯一的键。因此重复键将不起作用,因此它只会保存一个值。但是,如果您保留唯一的一个键,即 tag 和值作为列表应该可以工作。

话虽如此,json.dumpsjson.loads 不会处理包含tuplebyte 等对象的dict 对象。在您的示例中,列表是存在 JSON(反)序列化问题的字节字符串。

现在,如果您不关心字节字符串并想解码为基本上转换为字符串的utf-8,那么您可以在此处找到解决方案。

l = [b'E28011600000208', b'E28023232083', b'3000948484']
l = list(map(lambda x: x.decode('utf-8'), l)))
data = json.dumps({'tag': l})
print(data)
# Out: '{"tag": ["E28011600000208", "E28023232083", "3000948484"]}'

但是如果你想保留字节字符串,那么看看如何通过额外的参数cls 使用自定义 json 编码器类对对象进行序列化和反序列化处理

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

pickle 是另一个用于打包/解包数据的有用库,它确实可以处理任何对象(python)。但是如果需要共享给第三个应用程序,它会以字节字符串的形式返回打包数据。在内存缓存任何 python 对象时非常有用。

pickle.loads(pickle.dumps(l))

【讨论】:

  • 我尝试了您的代码的变体,但出现错误,请查看我在底部添加的信息。
  • 这是与您的数据相关的错误.. 试试这个.. tag = list(map(lambda x: str(x).decode('utf-8'), tag)).. . 确保数据一致性...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2014-02-26
  • 2012-06-13
  • 2020-04-01
  • 2019-06-12
相关资源
最近更新 更多