fastjson转换对象实体@JsonProperty不生效问题及解决

作者:码农晴明_ 时间:2023-10-07 00:13:51 

fastjson转换对象实体@JsonProperty不生效

项目场景

请求第三方应用 返回json数据

问题描述

第三方返回的数据中,存在java关键词,无法直接使用原属性名进行对应 例如(class、interface等)使用@JsonProperty注解不能返回正确的结果

@Data
static class User{
     @JsonProperty( "class")
     private String userClass;
     @JsonProperty("interface")
     private String userInterface;
}
public static void main(String[] args) {
    Map<String,Object> map = new HashMap<>();
    map.put("class","测试");
    map.put("interface","测试1");
    String mapStr = JSONObject.toJSONString(map);
    System.out.println(mapStr);
    User user = JSONObject.parseObject(mapStr, User.class);
    System.out.println(user);
}

正常情况来讲 @JsonProperty 注解完全够用,可以成功解析出想要的结果。

但往往事情并不是那么简单

执行结果 :

{"interface":"测试1","class":"测试"}

User(userClass=null, userInterface=null)

可以看出并没有成功映射到想要的数据

原因分析

具体原因感兴趣的同学可以看下 JSONObject.parseObject 的源码

解决方案

解决方法有两种

1、修改属性名称,使用原属性名 + &ldquo;_&rdquo;

@Data
static class User{
    @JsonProperty( "class")
    private String class_;
   @JsonProperty("interface")
   private String interface_;
}
public static void main(String[] args) {
    Map<String,Object> map = new HashMap<>();
    map.put("class","测试");
    map.put("interface","测试1");
    String mapStr = JSONObject.toJSONString(map);
    System.out.println(mapStr);
    User user = JSONObject.parseObject(mapStr, User.class);
    System.out.println(user);
}

执行结果 :

{"interface":"测试1","class":"测试"}

User(class_=测试, interface_=测试1)

2、使用fastjson @JSONField注解

@Data
static class User{
@JSONField(name = "class")
private String userClass;
@JSONField(name = "interface")
private String userInterface;
}
public static void main(String[] args) {
    Map<String,Object> map = new HashMap<>();
    map.put("class","测试");
    map.put("interface","测试1");
    String mapStr = JSONObject.toJSONString(map);
    System.out.println(mapStr);
    User user = JSONObject.parseObject(mapStr, User.class);
    System.out.println(user);
}

执行结果:

{"interface":"测试1","class":"测试"}

User(userClass=测试, userInterface=测试1)

@JsonProperty 失效问题的排查

@JsonProperty 是Jackson提供的一个用于注解属性、类、方法等的json注解。使用它可以改变Json序列化时属性的名称,一般默认使用属性名,比如如下的代码示例,如果没有使用@JsonProperty注解那么id转化为json为{&ldquo;id&rdquo;:11}.使用了则就是{&ldquo;Id&rdquo;:11}.

@JsonInclude(Include.NON_NULL)
public class User implements Serializable {

@JsonProperty("Id")
private Integer id;
@JsonProperty("Name")
private String name;
@JsonProperty("pwd")
private Integer passWord;
}

在一次使用springboot项目时发现@JsonProperty不生效。

那么是因为啥呢?

因为在项目里还引用了fastJson,在debug时发现接口最后响应时是使用FastJson做json序列化。

解决方法:

使用@EnableWebMvc注解,加在启动类上。或者直接在项目里不引用fastJson.

@EnableWebMvc
public class SpringBootMain extends SpringBootServletInitializer implements WebApplicationInitializer {

@Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       return application.sources(SpringBootMain.class);
   }
}

springboot 是如何选择使用json序列化工具的呢?即如何调用jackson进行json序列化和反序列化?

springboot 通过HttpMessageConverters 消息转换器通过jackson将java对象转化为json字符串。如果项目里包含多个json工具包比如jackson ,fastjson,那么就会各个年级对象的内容选择一个合适的去转换为json。

fastjson转换对象实体@JsonProperty不生效问题及解决

这是HttpMessageConverters 消息转换器所处的位置,所以项目里采用那个json工具由该类决定。

springboot默认使用jackson,springboot默认集成的就是jackson。

指定使用fastJson的一种做法:


public class SpringBootMain extends SpringBootServletInitializer implements WebApplicationInitializer {
   @Bean
   public HttpMessageConverters fastJsonHttpMessageConverters() {
       // 1.定义一个converters转换消息的对象

FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
       // 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据

FastJsonConfig fastJsonConfig = new FastJsonConfig();
       fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
       // 3.在converter中添加配置信息
       fastConverter.setFastJsonConfig(fastJsonConfig);
       // 4.将converter赋值给HttpMessageConverter
       HttpMessageConverter<?> converter = fastConverter;
       // 5.返回HttpMessageConverters对象
       return new HttpMessageConverters(converter);
   }
}

来源:https://blog.csdn.net/smlie_shuihan/article/details/121420204

标签:fastjson,对象实体,@JsonProperty
0
投稿

猜你喜欢

  • Android中自定义View的实现方式总结大全

    2023-02-03 08:55:55
  • Springmvc ResponseBody响应json数据实现过程

    2022-06-12 15:22:30
  • C#定时关闭窗体实例

    2023-07-09 22:53:25
  • Android可配置透明度的水印

    2021-06-06 14:07:42
  • C# dll代码混淆加密的实现

    2022-01-06 17:25:04
  • Unity Shader实现3D翻页效果

    2021-10-07 10:03:45
  • Android扩大View点击范围的方法

    2022-07-21 17:49:29
  • C#利用SharpPcap实现网络包捕获嗅探

    2021-11-24 00:47:27
  • Android动画之小球拟合动画实例

    2023-06-11 00:47:46
  • Unity 如何通过反射给gameObject添加组件

    2022-06-14 20:58:34
  • android中DatePicker和TimePicker的使用方法详解

    2021-08-28 14:45:13
  • SpringBoot 如何优雅的实现跨服务器上传文件的示例

    2023-07-03 21:42:56
  • Springboot集成ClickHouse及应用场景分析

    2022-04-02 16:28:46
  • Spring Security OAuth2 实现登录互踢的示例代码

    2023-09-04 19:09:28
  • Java实现带GUI的气泡诗词效果

    2022-09-12 18:04:48
  • 服务器端C#实现的CSS解析器

    2022-01-25 12:26:20
  • 一款域名监控小工具 Domain(IP)Watcher 实现代码

    2023-09-15 11:55:44
  • SpringCloud迈向云原生的步骤

    2023-08-21 22:59:46
  • Springboot JPA 枚举Enum类型存入到数据库的操作

    2023-11-25 16:11:40
  • Flutter的键值存储数据库使用示例详解

    2023-10-15 02:13:15
  • asp之家 软件编程 m.aspxhome.com