我正在尝试创建类实例的JSON字符串表示形式并且遇到困难。假设该类的构建如下:
class testclass:
value1 = "a"
value2 = "b"
像这样对json.dumps进行调用:
t = testclass()
json.dumps(t)
失败了,并告诉我testclass不可JSON序列化。
TypeError: <__main__.testclass object at 0x000000000227A400> is not JSON serializable
我也尝试过使用pickle模块:
t = testclass()
print(pickle.dumps(t, pickle.HIGHEST_PROTOCOL))
它提供类实例信息,但不提供类实例的序列化内容。
b'\x80\x03c__main__\ntestclass\nq\x00)\x81q\x01}q\x02b.'
我究竟做错了什么?
基本问题是,JSON编码器json.dumps()
仅知道默认情况下如何序列化一组有限的对象类型(所有内置类型)。在此处列出:https : //docs.python.org/3.3/library/json.html#encoders-and-
decoders
一种好的解决方案是使您的类继承自该类JSONEncoder
,然后实现该JSONEncoder.default()
函数,并使该函数为您的类发出正确的JSON。
一个简单的解决方案是调用该实例json.dumps()
的.__dict__
成员。那是一个标准的Python
dict
,如果您的类很简单,它将是JSON可序列化的。
class Foo(object):
def __init__(self):
self.x = 1
self.y = 2
foo = Foo()
s = json.dumps(foo) # raises TypeError with "is not JSON serializable"
s = json.dumps(foo.__dict__) # s set to: {"x":1, "y":2}
在此博客文章中讨论了上述方法:
使用__dict__将任意Python对象序列化为JSON
我有一个通过RabbitMQ作为消息发送的类,在sender服务上,它的定义如下: 并且在接收方服务上: 在receiver controller中,我有以下方法,它应该接受该消息,将其转换为一个对象,并将其保存在数据库中,看起来如下所示: 编辑:根据请求添加堆栈跟踪。
它提供类实例信息,但不提供类实例的序列化内容。 我做错了什么?
问题内容: 我想通过实施将其序列化为Json 该映射序列化为非标准。我想在单元测试中测试此行为。 问题答案: 你不能像这样测试。你在这里做什么 正在建立 出站 响应。在JAX-RS框架中,发出响应后,例如 它仍然需要通过序列化到JSON。 阅读有关实体提供者的更多信息 话虽如此,泽西岛有一个测试框架,我们可以用来测试我们的资源方法。您可以在Github上找到所有官方示例 一个样本(有一些改动):
问题内容: 我在这里发现了同样的问题… …但是没有正确的答案。 最好的建议之一是将嵌套对象包装到新类中,但是这种方法引入了另一个问题:乐高名称。 在我的示例中,此类的最逻辑名称是与父类相同的名称,当然这是不可能的。我的示例很简单,我只想消除父类中的“语言”属性。有人可以帮我做吗? json的示例: 问题答案: 如果JSON属性名称与c#命名约定冲突,则可以在序列化期间使用或批注替换其他名称。 例如
问题内容: 刚刚下载了ServiceStack.Text以在我的ASP.NET中使用它。我有很多属性的类,想将其中的五个(字符串,整数,二进制)序列化为JSON。有人可以发布简单的示例如何从我的课程中创建JSon对象吗? 问题答案: 默认情况下,ServiceStack将反序列化POCO的所有公共属性。 如果只想序列化一些属性,则想用[DataContract],[DataMember]属性装饰类
看起来杰克逊无法处理同名的属性和属性。