当前位置: 首页 > 知识库问答 >
问题:

使用ObjectMapper,JSON序列化和反序列化的工作方式不同

景鸿才
2023-03-14

我有一个这样的JSON:

{
  "commonObjects": [
    {
      "type": "C",
      "C": "1234567890"
    },
    {
      "type": "C",
      "c": "0987654321"
    },
    {
      "type": "B",
      "b": "ABCDEFGH"
    },
    {
      "type": "A",
      "A": "11111111",
      "AA": "22222222"
    }
  ]
}

所有类型都可以包含可变时间,或者只能有一种类型只有一次。

在SpringBoot应用程序中,我有三个类,扩展了公共类。

public class AObject extends CommonObject {
    @JsonProperty("A")
    private String a;
    @JsonProperty("AA")
    private String aa;
}
public class BObject extends CommonObject {
    @JsonProperty("B")
    private String b;
}
public class CObject extends CommonObject {
    @JsonProperty("C")
    private String c;
}
public class CommonObject {
    private String type;
}
public class CommonObjects {
    List<CommonObject> commonObjects;
}

我有两种方法来序列化和反序列化它。

return objectMapper.writeValueAsString(commonObjects);
...
return objectMapper.readValue(jsonValue, CommonObjects.class);

虽然测试序列化是可以的,但是反序列化在默认情况下不起作用。所以我修改了<code>CommonObject</code>如下:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    property = "type",
    visible = true)
@JsonSubTypes({
    @JsonSubTypes.Type(value = AObject.class, name = "A"),
    @JsonSubTypes.Type(value = BObject.class, name = "B"),
    @JsonSubTypes.Type(value = CObject.class, name = "C")
})
public class CommonObject {
  private String type;
}

现在,反序列化工作正常,但序列化不行。json值中包含属性< code>type两次。

有什么方法可以处理这个特殊的问题,还是我必须自己编写自定义反序列化器?

共有1个答案

范楚
2023-03-14

您的< code>CommonObject类中有两个问题需要解决。

  • 删除可见 = true(因此默认为 visible = false)。
    这意味着 JSON 输入中的类型不会反序列化为 Java 类型属性。
  • 删除属性私有字符串类型;
    这是因为在 JSON 输出中,您只需要根据@JsonTypeInfo@JsonSubTypes类型,而不需要从 Java 类型属性序列化。
 类似资料:
  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。

  • 本文向大家介绍.NET中JSON的序列化和反序列化的几种方式,包括了.NET中JSON的序列化和反序列化的几种方式的使用技巧和注意事项,需要的朋友参考一下 一、什么是JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立 于编程语言的文本格式来存

  • 嗨,我有LogEventObject在客户端用于记录事件,我想使用REST API将其发送到服务器。我将LogEventObject转换为json字符串,并通过REST将其作为有效载荷发送。在服务器端,我使用Groovy,当我尝试做对象apper.read值()时,我得到以下错误。 com.fasterxml.jackson.databind.JsonMappingExc0019:找不到非具体的集

  • 本文向大家介绍ASPNET中JSON的序列化和反序列化的方法,包括了ASPNET中JSON的序列化和反序列化的方法的使用技巧和注意事项,需要的朋友参考一下 一、JSON简介  JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。 JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'

  • 问题内容: 当我向服务(我不拥有)发送请求时,它可能会以请求的JSON数据或看起来像这样的错误进行响应: 在这两种情况下,HTTP响应代码均为200 OK,因此我不能用它来确定是否存在错误-我必须反序列化响应以进行检查。所以我有这样的东西: 在这里,我有一个空的catch子句,该子句可能在标准执行路径中,这是一种难闻的气味……嗯,不仅仅是难闻的气味:它发臭。 您是否知道 “ TryParse” 响

  • 我使用的是Spring Kafka 1.1.2-Spring Boot 1.5.0 RC版本,并且配置了一个自定义值serialiser/Deserialiser类,扩展/。这些类确实使用Jackson ObjectMapper,它可以通过构造函数提供。 是否可以从Spring上下文中注入ObjectMapper?我已经配置了一个ObjectMapper,我希望在序列化/反序列化程序中重用它。