精华内容
下载资源
问答
  • jackson 序列化、反序列化示例 import com.fasterxml.jackson.databind.ObjectMapper; public class LocaTest { public static void main(String[] args) { ObjectMapper objectMapper = new ObjectMapper();

    jackson 序列化、反序列化示例

    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public class LocaTest {
        public static void main(String[] args) {
            ObjectMapper objectMapper = new  ObjectMapper();
            try {
                String resultStr = objectMapper.writeValueAsString(new User("id2342342", "Jack"));
                System.out.println(resultStr);
                User usr = objectMapper.readValue(resultStr, User.class);
                System.out.println(usr);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    class User {
        public User() {
        }
    
        public User(String id, String name) {
            this.id = id;
            this.name = name;
        }
    
        private String id;
        private String name;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    maven依赖(会传递引出core及annotation)

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
    </dependency>
    输出结果

    {"id":"id2342342","name":"Jack"}
    User{id='id2342342', name='Jack'}

    展开全文
  • fastJosn Gson Jackson 序列化和反序列化所需要的jar,已经全部验证过,请放心使用咯
  • Fastjson与Jackson序列化反序列化差异对比 对基本数据类型boolean的处理 当boolean类型字段以is开头,Fastjson与Jackson序列化结果一样,is被去掉。当使用的Jackson和Fastjson的字段转换注解(@JsonProperty(...

    Fastjson与Jackson序列化反序列化差异对比

    1. 对基本数据类型boolean的处理

    当boolean类型字段以is开头,Fastjson与Jackson序列化结果一样,is被去掉。当使用的Jackson和Fastjson的字段转换注解(@JsonProperty(“isXXX”),@JSONFied(name=“isXXX”))时,Fastjson序列化后字段名为isXXX,Jackson序列化后生成两个字段isXXX和XXX。如果将字段isXXX映射为XXX(即使用注解@JsonProperty(“XXX”)或@JSONField(name=“XXX”)时),Fastjson和Jackson序列化后结果一样。

    2. 对Java.sql.Date的特殊处理

    Fastjson版本1.2.57~1.2.61版本对java.sql.Date类型字段特殊处理,序列化后为yyyy-MM-dd格式,其余版本与Jackson处理结果一致。

    3. 找不到属性setter方法的处理

    反序列时,默认情况下,如果根据json字符串的属性,在实体类中找不到对应的setter方法,Fastjson会忽略该属性,Jackson会报错,(Jackson通过配置DeserializationFeature.Fail_ON_UNKNOW_PROPERTIES为false忽略找不到setter方法的属性)。
    在反序列化时,若找不到属性的setter方法,Jackson会进一步找同名字段,Fastjson会直接忽略。

    4. 对字段名没有被引号包括起来的处理

    对于Json字符串中字段名没有被引号包括起来Fastjson默认是支持的,Jackson默认不支持,需通过配置JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES为true开启。

    5. 序列化时值为null

    Fastjson在序列化时如果值为null,默认序列化后属性被忽略,需要配置SeralizerFeature.WriteMapNullValue开启;
    Jackson在序列化时如果值为null,默认配置序列化后属性保留,值为null。

    6. 对被transient修饰的属性的序列化

    Fastjson序列化时默认忽略被transient修饰的属性;
    Jackson序列化时被transeint修饰的属性默认序列化,如果不序列化需要配置MapperFeature.PROPAGATE_TRANSIENT_MARKER为true.

    7. Fastjson的 AutoType特性

    当一个类中包含了接口(或抽象类)的时候,在使用Fastjson进行序列化的时候,会把子类型抹去,只保留接口(抽象类)的类型,使得反序列化时无法拿到原始类型。Fastjson引入AutoType,在序列化的售后把原始类型记录下来,以便于在反序列化的时候找到对应的类型。Fastjson在版本1.2.25之后AutoType默认关闭,如果使用了Fastjson的AutoType特性在替换为Jackson时可以在属性上使用@JsonTypeInfo,次注解用于序列化有关多态实例的实际信息,以便于Jackson可以知道要反序列的子类型

    展开全文
  • fastjson和jackson序列化数据的区别直奔主题一言不合就上代码注意 直奔主题 1、fastjson将字符串反序列化为对象时,只会处理第一层,内部会序列化为JsonObject或者JsonArray,使用二级结构和三级结构时还要再次处理...
  • fastjson、gson、jackson序列化和反序列化所用json文件
  • 自定义注解序列化反... jackson序列化需要在自定义注解上面加上@JsonSerialize(using = ImageURLSerialize.class) ImageURLSerialize是自定义的注解要做的事情实现 /** * 图片序列化注解 */ @Retention(Retentio

    自定义注解序列化反序列化解析参数

    	需求:图片链接插入和修改切除图片的头部信息,查询的时候添加头部信息
    	解决办法:自定义注解在图片链接字段上,在序列化和反序列化是根据注解标记添加或者切除图片头部链接
    

    jackson序列化

    	jackson序列化需要在自定义注解上面加上@JsonSerialize(using = ImageURLSerialize.class)
    	ImageURLSerialize是自定义的注解要做的事情实现
    
    /**
     * 图片序列化注解
     */
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotationsInside
    @JsonSerialize(using = ImageURLSerialize.class)
    public @interface ImageURL {
        String param() default "";
    }
    
    	 继承JsonSerializer,jackson序列化会触发此方法,对值进行修改
    	 实现 ContextualSerializer 解析自定义注解参数值,可以把需要改变的值定义到注解参数里面
    
    public class ImageURLSerialize extends JsonSerializer<String> implements ContextualSerializer {
    
        /**
         * 图片参数
         */
        private String param;
    
        public ImageURLSerialize(String param) {
            this.param = param;
        }
    
        public ImageURLSerialize() {
        }
    
        @Override
        public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            String url = "";
            String cdn = SpringUtils.getBean(QiNiuConfig.class).getCdn();
            if (!StringUtils.isEmpty(value)) {
                if (value.contains(cdn)) {
                    url = value;
                } else {
                    url = cdn + value;
                }
            }
            jsonGenerator.writeString(url);
        }
    
        @Override
        public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
            if (beanProperty != null) { // 为空直接跳过
                if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { // 非 String 类直接跳过
                    ImageURL imageURL = beanProperty.getAnnotation(ImageURL.class);
                    if (imageURL == null) {
                        imageURL = beanProperty.getContextAnnotation(ImageURL.class);
                    }
                    if (imageURL != null) { // 如果能得到注解,就将注解的 value 传入 ImageURLSerialize
                        return new ImageURLSerialize(imageURL.param());
                    }
                }
                return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
            }
            return serializerProvider.findNullValueSerializer(beanProperty);
        }
    }
    

    jackson反序列化

    	jackson反序列化需要在自定义注解上面加上@JsonDeserialize(using = ImageUrlDeserializer.class)
    	ImageUrlDeserializer是自定义的注解要做的事情实现
    
    /**
     * 图片反序列化注解
     */
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotationsInside
    @JsonDeserialize(using = ImageUrlDeserializer.class)
    public @interface DeserializeImageURL {
        String param() default "";
    }
    
     	继承JsonDeserializer,jackson反序列化会触发此方法,对值进行修改
    	实现 ContextualSerializer 解析自定义注解参数值,可以把需要改变的值定义到注解参数里面
    
    public class ImageUrlDeserializer extends JsonDeserializer<String> implements ContextualSerializer {
        @Override
        public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            try {
                if (jsonParser != null && StringUtils.isNotEmpty(jsonParser.getText())) {
                    String text = jsonParser.getText();
                    String cdn = SpringUtils.getBean(QiNiuConfig.class).getCdn();
                    if (text.contains(cdn)) {
                        return text.replace(cdn, "");
                    }
                } else {
                    return null;
                }
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            return null;
        }
    
        @Override
        public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
            if (beanProperty != null) { // 为空直接跳过
                if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { // 非 String 类直接跳过
                    DeserializeImageURL imageURL = beanProperty.getAnnotation(DeserializeImageURL.class);
                    if (imageURL == null) {
                        imageURL = beanProperty.getContextAnnotation(DeserializeImageURL.class);
                    }
                    if (imageURL != null) { // 如果能得到注解,就将注解的 value 传入 ImageURLSerialize
                        return new ImageURLSerialize(imageURL.param());
                    }
                }
                return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
            }
            return serializerProvider.findNullValueSerializer(beanProperty);
        }
    }
    
    展开全文
  • ZonedDatatime的Jackson序列化问题尝试手动进行LocalDateTime字段的转换LocalDate的序列化枚举值转化最终结果 最近测试接口需要用到Jackson序列化和反序列化,其中发现对于时间类型的变量Jackson的序列化过程和反...


    最近测试接口需要用到Jackson序列化和反序列化,其中发现对于时间类型的变量Jackson的序列化过程和反序列化过程不可逆,即序列化产生的结果无法被反序列化解析回ZonedDatatime对象,经过一番调整后问题解决,现将过程记录如下。
    使用Jackson模块对ZonedDatetime序列化后产生结果的形式如下

    {
        "offset": {
            "totalSeconds": 25200,
            "rules": {
                "fixedOffset": true,
                "transitionRules": [
                ],
                "transitions": [
                ],
                "class": "java.time.zone.ZoneRules"
            },
            "id": "+07:00",
            "class": "java.time.ZoneOffset"
        },
        "year": 2020,
        "dayOfYear": 181,
        "nano": 364000000,
        "chronology": {
            "calendarType": "iso8601",
            "id": "ISO",
            "class": "java.time.chrono.IsoChronology"
        },
        "minute": 15,
        "second": 38,
        "dayOfWeek": "MONDAY",
        "month": "JUNE",
        "hour": 18,
        "dayOfMonth": 29,
        "zone": {
            "rules": {
                "fixedOffset": true,
                "transitionRules": [
                ],
                "transitions": [
                ],
                "class": "java.time.zone.ZoneRules"
            },
            "id": "GMT+07:00",
            "class": "java.time.ZoneRegion"
        },
        "monthValue": 6,
        "class": "java.time.ZonedDateTime"
    }
    

    但是这个结果用Jackson进行反序列化后,类型为LocakDateTime的dataTime字段会被变成null。可以看到文本中也确实没有dateTime字段。

    尝试手动进行LocalDateTime字段的转换

    直接对一个LocalDatetime进行Jackson序列化

        public static void main(String[] args) throws JsonProcessingException {
            LocalDateTime time= LocalDateTime.now();
            String json=(new ObjectMapper()).writeValueAsString(time);
            System.out.println(json);
        }
    

    显示的结果如下

    {
        "dayOfMonth":7,
        "dayOfWeek":"TUESDAY",
        "dayOfYear":189,
        "hour":16,
        "minute":44,
        "month":"JULY",
        "monthValue":7,
        "nano":743000000,
        "second":54,
        "year":2020,
        "chronology":{
            "id":"ISO",
            "calendarType":"iso8601"
        }
    }
    

    对比上方的ZonedDateTime的序列化结果可以发现dateTime内的字段又被提了出来,所以将这些字段疯传到"dateTime"中似乎可以解决问题。但是之后又显示没有date对象。

    LocalDate的序列化

    阅读JDK源代码中的LocalDateTime发现

        /**
         * The date part.
         */
        private final LocalDate date;
        /**
         * The time part.
         */
        private final LocalTime time;
    

    推测是LocalDateTime中同样出现了字段被拉平的问题,于是对LocalDate对象进行序列化,结果如下

        public static void main(String[] args) throws JsonProcessingException {
            LocalDate time=LocalDate.now();
            String json=(new ObjectMapper()).writeValueAsString(time);
            System.out.println(json);
        }
    

    果不其然,结果如下

    {
        "year":2020,
        "month":"JULY",
        "chronology":{
            "id":"ISO",
            "calendarType":"iso8601"
        },
        "dayOfMonth":7,
        "dayOfWeek":"TUESDAY",
        "dayOfYear":189,
        "era":"CE",
        "monthValue":7,
        "leapYear":true
    }
    

    LocalDate同样有自己的字段,也被提到了LocalDateTime中。虽然多了一些东西,但是只把LocalDateTime中也出现的进行整理就行,对LocalTime做同样的工作。

    枚举值转化

    经过这些操作后形式如下

    {
        "offset": {
            "totalSeconds": 25200,
            "rules": {
                "fixedOffset": true,
                "transitionRules": [
                ],
                "transitions": [
                ],
                "class": "java.time.zone.ZoneRules"
            },
            "id": "+07:00",
            "class": "java.time.ZoneOffset"
        },
        "dateTime": {
            "date": {
                "year": 2019,
                "dayOfYear": 156,
                "chronology": {
                    "calendarType": "iso8601",
                    "id": "ISO",
                    "class": "java.time.chrono.IsoChronology"
                },
                "dayOfWeek": "WEDNESSDAY",
                "month": "MAY",
                "dayOfMonth": 5,
                "monthValue": 6
            },
            "time": {
                "hour": 0,
                "minute": 0,
                "second": 0,
                "nano": 841000000
            },
            "class": "java.time.LocalDateTime"
        },
        "zone": {
            "rules": {
                "fixedOffset": true,
                "transitionRules": [
                ],
                "transitions": [
                ],
                "class": "java.time.zone.ZoneRules"
            },
            "id": "GMT+07:00",
            "class": "java.time.ZoneRegion"
        },
        "class": "java.time.ZonedDateTime"
    }
    

    本以为问题结束了,结果又出现了新问题,月份的MAY无法被识别。原因显而易见,上面的源代码中可以看到月份本来应该是数值类型的枚举的,结果在json中变成了字符串,因此将"MAY"改为5即可,其他月份同理。

    最终结果

    {
        "offset": {
            "totalSeconds": 25200,
            "rules": {
                "fixedOffset": true,
                "transitionRules": [
                ],
                "transitions": [
                ],
                "class": "java.time.zone.ZoneRules"
            },
            "id": "+07:00",
            "class": "java.time.ZoneOffset"
        },
        "dateTime": {
            "date": {
                "year": 2019,
                "dayOfYear": 156,
                "chronology": {
                    "calendarType": "iso8601",
                    "id": "ISO",
                    "class": "java.time.chrono.IsoChronology"
                },
                "dayOfWeek": "WEDNESSDAY",
                "month": 6,
                "dayOfMonth": 5,
                "monthValue": 6
            },
            "time": {
                "hour": 0,
                "minute": 0,
                "second": 0,
                "nano": 841000000
            },
            "class": "java.time.LocalDateTime"
        },
        "zone": {
            "rules": {
                "fixedOffset": true,
                "transitionRules": [
                ],
                "transitions": [
                ],
                "class": "java.time.zone.ZoneRules"
            },
            "id": "GMT+07:00",
            "class": "java.time.ZoneRegion"
        },
        "class": "java.time.ZonedDateTime"
    }
    

    至此ZonedDateTime的json终于可以被Jackson识别并加载对象了。

    展开全文
  • 主要给大家介绍了关于如何利用Jackson序列化忽略指定类型的属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 文章目录Jacksonjackson实现序列化(对象转为json)jackson实现反序列化JavaType反序列化List泛型反序列化Map泛型反序列化 Jackson jackson实现序列化(对象转为json) 需实现Serializable接口 ObjectMapper mapper = ...
  • 自定义jackson序列化 tl; dr:将输入验证添加到Jackson中的自定义json解串器中很重要。 在RHQ中,我们在几个地方使用了Json解析-直接在as7 / Wildfly插件中,或者通过RESTEasy 2.3.5间接在REST-api中使用,已经很...
  • 这次开发一个需求的时候, 接口传输时字段首字母要大写, jackson默认序列化时首字母会小写, 网上有人说用@JsonProperty注解标识字段名, 我试了一下确实可以让字段名大写, 但是必须在get || set方法上再加一个@...
  • jackson序列化字段字母大小写 代码从springboot默认的jackson切换到fastjson 发现字段xAxis 从xaxis 变成了xAxis 使用lombok@Getter注解实现get方法 发现该方法的get方法为getXAxis 根据jackson序列化规则会转化为 ...
  • Jackson序列化和反序列化忽略字段

    万次阅读 2017-11-13 18:53:56
    一、设置Jackson序列化时只包含不为空的字段 new ObjectMapper().setSerializationInclusion(Include.NON_NULL); 二、设置在反序列化时忽略在JSON字符串中存在,而在Java中不存在的属性 new ObjectMapper.disable...
  • Jackson序列化丢失泛型

    千次阅读 2018-09-01 15:18:05
    经过 项目中遇到一个奇怪的bug,即一...经过排查,发现是该map被Jackson序列化后,key的类型从Integer变成了String类型。再经过反序列化,即使已经声明key泛型的Integer,反序列化后内存数据中的key为String并不是I...
  • Jackson 序列化和反序列化忽略字段

    千次阅读 2019-05-01 02:15:29
    一、设置Jackson序列化时只包含不为空的字段 new ObjectMapper().setSerializationInclusion(Include.NON_NULL); 二、设置在反序列化时忽略在JSON字符串中存在,而在Java中不存在的属性 new Obj...
  • 使用springboot框架,然后给前端返回json数据的时候出现了上述错误,,查阅资料发现了问题: ...@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})//会导致jackson序列化出错 ...
  • 前言 最近在项目使用json字符串转javaBean 在转换过程中发现json转到JavaBean的时候属性名称不一至。例如json字符串为: { "code": "1", "message": "操作成功" } ...public class Result ...引用 jackson-ann
  • jackson序列化bean时,如果bean中有时间类型字段,默认是转为unix时间戳形式的。 在前台页面显示很不友好,需要格式化。那么我们可以使用jackson自带的注解@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss") 进行...
  • spring.jackson.date-format全局配置jackson序列化失效 在spring框架的管理下,有许多通用的配置减少了开发人员不少的时间成本,就例如全局配置jackson对日期格式数据的序列化方式,可以省去我门通篇@JsonFormat()的...
  • Jackson序列化教程

    千次阅读 2020-06-02 15:28:41
    309.5,"amount":2005,"saleTime":"1997-02-09 10:30:20"}, {"id":8,"name":"笑傲江湖","price":280.0,"amount":4700,"saleTime":"2001-06-02 10:30:20"} ] } 5、Jackson序列化配置 //这个特性,决定了解析器是否将...
  • Jackson序列化提供了对基本数据类型和简单Bean的序列化的支持, 以及对类继承的支持。 已经经过测试的数据类型包括: Boolean/boolean Long/long Integer/int Double/double Short/short Float/float Byte/...
  • 1、序列化(别名方式) 采用@JsonProperty 注解标识别名 如果属性是非String类型的,可以设置相关的序列化过滤原则,比如Long型的,定义为0时过滤,在相关字段上加@JsonSerialize指定相关规则: public class Trace...
  • Jackson序列化与反序列化属性总结

    千次阅读 2018-12-21 15:02:31
    关于json 转换BigDecimal精度丢失问题:https://www.cnblogs.com/zyzcj/p/7841054.html 原文地址:...amp;utm_medium=referral 第一章 JacksonUtil 序列化与反序列化属性总结 ...
  • 用于PostGIS Geometry对象的GeoJSON Jackson序列化器和反序列化器。 GeoJSON支持 该库支持对GeoJSON规范中定义的所有序列化/反序列化。 下面给出了GeoJSON几何对象与PostGIS对象之间的关系: GeoJSON 邮政地理...
  • Jackson序列化,反序列化,和泛型

    千次阅读 2020-06-11 14:07:12
    序列化和反序列化的过程中,泛型是永远离不开的主题,那么泛型有哪几种呢?Jackson又是如何来处理这些问题的呢? 泛型的类型参考 index Name Example 1 ParameterizedType 参数化类型,即泛型;例如:List...
  • jackson序列化方法实现

    2018-09-19 18:13:55
    支持列表 范型的转换等工具 Json字符串生成或解析处理工具类
  • Jackson主要使用ObjectMapper对象来进行序列化以及反序列化操作。 使用Jackson可以毫无压力的将复杂对象进行完全序列化,也可以将各种类型的对象反序列化   以下代码均省略异常处理 普通对象 序列化Order ...
  • Jackson提供了@Jsonignore这个注解,用于在(反)序列化时,忽略bean的某项属性。 这次项目将Jackson升级到了1.9版本,在Jackson1.9的时候,@Jsonignore的语义有了如下变化 1.9之前: 在Setter方法上加@Jsonig...
  • 几种常见方式 1. 全局application配置 常用配置: spring: jackson: date-format: yyyy-MM-dd HH:mm:ss serialization: true ...具体配置详见org.springframework.boot.autoconfigure.jackson.J

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,099
精华内容 11,639
关键字:

jackson序列化