java中的json序列化的问题?

在进行Java Web开发时,经常会遇到一些出乎预料的情况。这两天在开发过程中,就遇到了一个关于对象序列化的问题。问题大致是这样的:假设我们有一个接口类,需要将这个类的对象序列化为JSON返回。在Spring MVC中,通常情况下,返回ResponseBody时,对象会直接序列化为JSON。然而,返回的JSON结果与预期有所...
java中的json序列化的问题?
在进行Java Web开发时,经常会遇到一些出乎预料的情况。这两天在开发过程中,就遇到了一个关于对象序列化的问题。问题大致是这样的:

假设我们有一个接口类,需要将这个类的对象序列化为JSON返回。在Spring MVC中,通常情况下,返回ResponseBody时,对象会直接序列化为JSON。然而,返回的JSON结果与预期有所不同,多出了一个jsonstr字段。

起初,我怀疑问题出在Spring MVC上。但仔细思考后发现,Spring MVC之所以能将对象直接序列化为JSON,实际上是由于配置文件的作用,而真正进行序列化工作的其实是Jackson库。为了验证这一点,我尝试单独使用Jackson库,结果发现返回的JSON字符串与之前相同。由此可以确认,问题的根源在于Jackson库的设计。

深入探究

带着这个问题,我尝试了Java中常用的几款JSON序列化库,包括Jackson、FastJson和Gson,看看它们是否都会产生相同的问题。经过测试发现,Jackson和阿里开发的FastJson在序列化时,会额外添加一个jsonstr字段,而Gson则能按照我们预期的方式,只序列化对象的字段。

为了了解这些库的序列化原理,我查阅了它们的文档。Jackson和FastJson在序列化时,会首先使用反射找到对象类的所有get方法,接着获取返回值作为value,并将方法名小写化作为key值。然后,它们会再次使用反射查找field,并添加到JSON中。

而对于Gson来说,没有找到易于理解的解释,但感觉可能与getter方法无关。

在我们的AjaxJson类中存在一个getJsonStr方法,因此jsonStr作为key被序列化到JSON中了。针对这个问题,Jackson提供了相应的注解,可以将特定方法排除在序列化之外。只需要在方法前加上@JsonIgnore注解即可。

理解这个问题

在遇到问题时,不要忽视一些简单的地方,如getter和setter方法。在使用getXXX的地方,可以使用fetch等替代。

有时在类中定义一个private int mAge变量,而getter方法为getAge()。我们希望在序列化时得到的key为age而非mAge,这时,使用反射getter方法就显得尤为重要。2024-11-20
mengvlog 阅读 8 次 更新于 2025-07-20 23:39:52 我来答关注问题0
  •  翡希信息咨询 修复Long类型太长,而Java序列化JSON丢失精度问题的方法

    修复Long类型太长,在Java序列化JSON时丢失精度的问题,可以采取以下方法:一、使用注解方式 使用@JsonSerialize注解:在需要序列化的Long类型字段上使用此注解,可以确保序列化时该字段以字符串形式输出,从而保留精度。但此方法需要在每个对象的每个Long字段上单独添加注解,操作相对繁琐。二、设置全局配置 配...

  •  文暄生活科普 修复Long类型太长,而Java序列化JSON丢失精度问题的方法

    方法一:使用`@JsonSerialize(using=ToStringSerializer.class)`注解,确保序列化时保留精度。然而,此方法需在每个对象上单独添加注解,操作繁琐。方法二:设置全局配置,自动实现ToStringSerializer序列化。这样,无论何时使用JSON,精度丢失问题都得以解决。在Spring Boot中,若已使用fastjson或Jackson,可根据项目...

  •  文暄生活科普 Java 8 中 Jackson 序列化 LocalDateTime 的问题

    在使用Jackson进行序列化时,通常流程是这样的:首先定义一个类,将对象序列化为json字符串,然后对json字符串进行反序列化。此操作在IDEA中进行时,可以借助于快捷键进行简化操作。然而,当在类的属性中加入LocalDateTime类型的变量后,问题就出现了。尝试序列化后发现,输出的creatTime值并未按照预期格式显...

  •  翡希信息咨询 使用Jackson的@JsonAnyGetter灵活JSON序列化Java对象

    使用@JsonAnyGetter注解来标识一个返回Map类型数据的方法。这个方法返回的键值对将在序列化过程中被直接转换为JSON对象中的键值对。适应复杂消息类型:在处理多样化消息格式时,通过@JsonAnyGetter可以避免为每种消息类型在Java类中创建单独的字段,从而简化了类结构,减少了出错的可能性。结合@JsonIgnore使用...

  •  誉祥祥知识 使用Hutool 的JSONUtil 讲对象序列化JSONObject 后,若属性为空,这无法序列化问题

    在使用Hutool的JSONUtil将对象序列化为JSONObject时,若属性为空,可能会导致无法序列化的问题,以下是对此问题的详细解答及解决方案:问题原因:Hutool使用JSONNull表示空值。SpringBoot默认使用的序列化器Jackson,在将数据传递至接口时,会将Hutool的JSONObject转换为Map。Map中存在空值时,Jackson会尝试将JSON...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部