溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

fastjson轉(zhuǎn)換對象實體@JsonProperty不生效如何解決

發(fā)布時間:2022-08-30 11:11:40 來源:億速云 閱讀:442 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“fastjson轉(zhuǎn)換對象實體@JsonProperty不生效如何解決”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“fastjson轉(zhuǎn)換對象實體@JsonProperty不生效如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

    fastjson轉(zhuǎn)換對象實體@JsonProperty不生效

    項目場景

    請求第三方應(yīng)用 返回json數(shù)據(jù)

    問題描述

    第三方返回的數(shù)據(jù)中,存在java關(guān)鍵詞,無法直接使用原屬性名進(jìn)行對應(yīng) 例如(class、interface等)使用@JsonProperty注解不能返回正確的結(jié)果

    @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 注解完全夠用,可以成功解析出想要的結(jié)果。

    但往往事情并不是那么簡單

    執(zhí)行結(jié)果 :

    {"interface":"測試1","class":"測試"}

    User(userClass=null, userInterface=null)

    可以看出并沒有成功映射到想要的數(shù)據(jù)

    解決方案

    解決方法有兩種

    1、修改屬性名稱,使用原屬性名 + “_”

    @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);
    }

    執(zhí)行結(jié)果 :

    {"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);
    }

    執(zhí)行結(jié)果:

    {"interface":"測試1","class":"測試"}

    User(userClass=測試, userInterface=測試1)

    @JsonProperty 失效問題的排查

    @JsonProperty 是Jackson提供的一個用于注解屬性、類、方法等的json注解。使用它可以改變Json序列化時屬性的名稱,一般默認(rèn)使用屬性名,比如如下的代碼示例,如果沒有使用@JsonProperty注解那么id轉(zhuǎn)化為json為{“id”:11}.使用了則就是{“Id”: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項目時發(fā)現(xiàn)@JsonProperty不生效。

    那么是因為啥呢?

    因為在項目里還引用了fastJson,在debug時發(fā)現(xiàn)接口最后響應(yīng)時是使用FastJson做json序列化。

    解決方法:

    使用@EnableWebMvc注解,加在啟動類上?;蛘咧苯釉陧椖坷锊灰胒astJson.

    @EnableWebMvc
    public class SpringBootMain extends SpringBootServletInitializer implements WebApplicationInitializer {
     
       @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(SpringBootMain.class);
        }
    }

    springboot 是如何選擇使用json序列化工具的呢?即如何調(diào)用jackson進(jìn)行json序列化和反序列化?

    springboot 通過HttpMessageConverters 消息轉(zhuǎn)換器通過jackson將java對象轉(zhuǎn)化為json字符串。如果項目里包含多個json工具包比如jackson ,fastjson,那么就會各個年級對象的內(nèi)容選擇一個合適的去轉(zhuǎn)換為json。

    fastjson轉(zhuǎn)換對象實體@JsonProperty不生效如何解決

    這是HttpMessageConverters 消息轉(zhuǎn)換器所處的位置,所以項目里采用那個json工具由該類決定。

    springboot默認(rèn)使用jackson,springboot默認(rèn)集成的就是jackson。

    指定使用fastJson的一種做法:

     public class SpringBootMain extends SpringBootServletInitializer implements WebApplicationInitializer {
        @Bean
        public HttpMessageConverters fastJsonHttpMessageConverters() {
            // 1.定義一個converters轉(zhuǎn)換消息的對象
        
            FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
            // 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json數(shù)據(jù)
     
            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);
        }
    }

    讀到這里,這篇“fastjson轉(zhuǎn)換對象實體@JsonProperty不生效如何解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI