使用 Spring 和 Jackson JSON 将 java.io.Serializable 实例序列化为 JSON [重复]

Posted

技术标签:

【中文标题】使用 Spring 和 Jackson JSON 将 java.io.Serializable 实例序列化为 JSON [重复]【英文标题】:Serializing java.io.Serializable instance into JSON with Spring and Jackson JSON [duplicate] 【发布时间】:2014-02-07 12:55:28 【问题描述】:

我从一些内部 API 中获得了 Serializable 的实例。 Serializable 实例实际上是LongString 等。有没有办法制作一个可以处理这种情况的DTO?使用private Serializable value; JSON 以value: 结束。

更新

以下是相关代码的简化示例:

@Controller
public class SomeController

  //...
  public MyDto getInfo(Long id)
  
    MyDto result = new MyDto();
    Serializable obj = svc.getInfo(id);
    // obj is either Long, or String, or one of few more fundamental Java types
    result.setValue(obj);
    return result;
  


public class MyDto

  private Serializable value;
  public void setValue(Serializable info)
  
    this.value = value;
  
  public Serializable getValue()
  
    return value;
  

更新 2

我在这里找到了我的问题的答案:https://***.com/a/20494813/341065

【问题讨论】:

您可以使用自定义JsonDeserializer 来实现。 【参考方案1】:

请注意,Jackson 不会将java.io.Serializable 用于任何事情:添加它没有真正的价值。它会被忽略。

鉴于此,Jackson 将认为值等同于任何实际类型(对于序列化,即编写 JSON);或者,在阅读时,相当于java.lang.Object

如果您知道实际类型,您可以使用@JsonDeserialize(as=ActualType.class) 注释属性以给出提示。但如果实际值为Strings 和Longs,则确实不需要。

【讨论】:

实际类型是少数 Java 类型之一,例如 LongString。内部 API 返回Serializable。我曾尝试在 DTO 中仅传递 private Object value;,但在 JSON 中却一无所获。 Jackson 绝对应该将 Long 序列化为基本的 JSON 数字,将 String 序列化为 JSON String。但是您是按原样返回这些值,还是在某种包装对象中返回这些值? 查看更新后的问题。

以上是关于使用 Spring 和 Jackson JSON 将 java.io.Serializable 实例序列化为 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 Spring Boot Rest 使用 Jackson 验证 JSON

在 Spring MVC 中使用 Jackson JSON 解析 JSON

Spring boot与Jackson ObjectMapper

在 Jackson / Spring Boot 中测试自定义 Json Deserializer

Spring中利用jackson进行JSON转换

spring-boot用jackson改变json响应结构