无法将 python 列表序列化为 json

Posted

技术标签:

【中文标题】无法将 python 列表序列化为 json【英文标题】:Unable to serialise python list to json 【发布时间】:2020-03-15 22:45:15 【问题描述】:
[ 
    
      'topleft': 
         'x':34,
         'y':13
      ,
      'confidence':0.17681329,
      'bottomright': 
         'x':398,
         'y':347
      ,
      'label':'person'
   ,
    
      'topleft': 
         'x':29,
         'y':48
      ,
      'confidence':0.107129775,
      'bottomright': 
         'x':399,
         'y':351
      ,
      'label':'car'
   ,
    
      'topleft': 
         'x':20,
         'y':85
      ,
      'confidence':0.22963998,
      'bottomright': 
         'x':376,
         'y':350
      ,
      'label':'cat'
   ,
    
      'topleft': 
         'x':0,
         'y':2
      ,
      'confidence':0.12423642,
      'bottomright': 
         'x':372,
         'y':356
      ,
      'label':'sheep'
   ,
    
      'topleft': 
         'x':20,
         'y':12
      ,
      'confidence':0.26517922,
      'bottomright': 
         'x':378,
         'y':349
      ,
      'label':'dog'
   
]

这是从 TensorFlow 返回的对象数组。但是,在尝试使用 json.dumps 转换为 JSON 对象时,我收到了此错误 TypeError: 0.17681329 is not JSON serializable

我尝试使用 simplejson 并得到 Float32 不可序列化。如何将此对象数组转换为 JSON 可序列化?

【问题讨论】:

无法复制repl.it/repls/FlippantLastingEmulator 看起来像这样:Convert numpy type to python。您的 float 值(大概)是 numpy float 或特定于 tensorflow 的类型 float,而不是 python float。 可能是那个或小数:在我的回答中是一种将它们转换为浮点数的方法。 如果答案有帮助,请考虑将其标记为正确。 【参考方案1】:

为我工作:

Python 2.7.15+ (default, Oct  7 2019, 17:39:04) 
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = ['topleft': 'x': 34, 'y': 13, 'confidence': 0.17681329, 'bottomright': 'x': 398, 'y': 347, 'label': 'person', 'topleft': 'x': 29, 'y': 48, 'confidence': 0.107129775, 'bottomright': 'x': 399, 'y': 351, 'label': 'car', 'topleft': 'x': 20, 'y': 85, 'confidence': 0.22963998, 'bottomright': 'x': 376, 'y': 350, 'label': 'cat', 'topleft': 'x': 0, 'y': 2, 'confidence': 0.12423642, 'bottomright': 'x': 372, 'y': 356, 'label': 'sheep', 'topleft': 'x': 20, 'y': 12, 'confidence': 0.26517922, 'bottomright': 'x': 378, 'y': 349, 'label': 'dog']
>>> import json
>>> print json.dumps(a, indent=4)
[
    
        "topleft": 
            "y": 13, 
            "x": 34
        , 
        "confidence": 0.17681329, 
        "bottomright": 
            "y": 347, 
            "x": 398
        , 
        "label": "person"
    , 
    
        "topleft": 
            "y": 48, 
            "x": 29
        , 
        "confidence": 0.107129775, 
        "bottomright": 
            "y": 351, 
            "x": 399
        , 
        "label": "car"
    , 
    
        "topleft": 
            "y": 85, 
            "x": 20
        , 
        "confidence": 0.22963998, 
        "bottomright": 
            "y": 350, 
            "x": 376
        , 
        "label": "cat"
    , 
    
        "topleft": 
            "y": 2, 
            "x": 0
        , 
        "confidence": 0.12423642, 
        "bottomright": 
            "y": 356, 
            "x": 372
        , 
        "label": "sheep"
    , 
    
        "topleft": 
            "y": 12, 
            "x": 20
        , 
        "confidence": 0.26517922, 
        "bottomright": 
            "y": 349, 
            "x": 378
        , 
        "label": "dog"
    
]

【讨论】:

【参考方案2】:

您有一个Decimal 或一些numpy 类型,需要转换为float

import json
from decimal import Decimal

import numpy


class CustomJsonEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, Decimal):
            return float(obj)
        elif isinstance(obj, numpy.integer):
            return int(obj)
        elif isinstance(obj, numpy.floating):
            return float(obj)
        elif isinstance(obj, numpy.ndarray):
            return obj.tolist()
        return super(CustomJsonEncoder, self).default(obj)

然后拨打dumps如下:

json.dumps(data, cls=CustomJsonEncoder)

【讨论】:

你怎么知道值是浮点类型而不是十进制?尝试将其中一些浮点数转换为十进制然后转储,我得到一个类型错误 嗯,这可能是真的。 很好的答案!你能不能也看看this

以上是关于无法将 python 列表序列化为 json的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.x 无法将 Decimal() 序列化为 JSON

无法将 JSON 字符串反序列化为 C# 对象

将 Json 反序列化为实体框架无法将 int 转换为类型

将Json反序列化为Entity Framework无法将int转换为type

将 JSON 命名属性反序列化为 .Net 对象

C# JSON 将文件反序列化为对象列表失败,并将字符串转换为集合错误