首页 > 其他分享 >spring-JSON序列化

spring-JSON序列化

时间:2024-03-07 16:22:17浏览次数:21  
标签:null JsonToken spring JSON fieldType parsingContext 序列化 public

1,使用场景。

SpringBoot 默认 json 为 JackJson。在 Controller 需要返回 Json 数据时,我们使用了 RestController,如果想对返回的数据进行一定的处理,也就是序列化对象为 Json 时使用。

反序列化,就是当接收的参数想做一定处理,获取到处理后的数据时候。

2,JsonSerializer 序列化

1,自定义序列化

继承 JsonSerializer 类,重写 serialize 方法。

public class SelfJsonSerializer extends JsonSerializer {
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if( o == null ){
            jsonGenerator.writeObject("这是个 null 值");
        }else if(o.toString().length() <= 0){
            jsonGenerator.writeObject("这是个空白字符串");
        }else{
            jsonGenerator.writeObject(o.toString() + 111);
        }
    }
}

2,使用 @JsonSerialize 注解

@Data
public class Dog {
    private int id;
    @JsonSerialize(using = SelfJsonSerializer.class, nullsUsing = SelfJsonSerializer.class)
    private String name;
    private int price;

    public Dog(){}
    public Dog(int id, String name, int price){
        this.id = id;
        this.name = name;
        this.price = price;
    }
}

using

参数不为 null 时使用的序列化方法。

nullsUsing

参数为 null 时使用的序列化方法。

3,自定义反序列化

1,继承 JsonDeserializer,实现 deserialize 方法。

public class BdipIdArgumentDeserialize extends JsonDeserializer<Object> {
    @Override
    public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonStreamContext parsingContext = p.getParsingContext();
        JsonToken currentToken = p.getCurrentToken();

        Type fieldType;
        if (currentToken == JsonToken.START_ARRAY) {
            parsingContext = parsingContext.getParent();
            //获取泛型类型
            fieldType = TypeUtil.getTypeArgument(ReflectUtil
                    .getField(parsingContext.getCurrentValue().getClass(), parsingContext.getCurrentName())
                    .getGenericType());
        } else {
            fieldType = ReflectUtil
                    .getField(parsingContext.getCurrentValue().getClass(), parsingContext.getCurrentName())
                    .getType();
        }
        if (currentToken == JsonToken.VALUE_STRING) {
            if(p.getValueAsString() != null && !p.getValueAsString().equals("")) {

                //兼容未加密的情况
                return Convert.convert(fieldType, EncryptUtil.decryptMsg(p.getValueAsString()) );
            }
        }
        //int 就直接返回
        if (currentToken == JsonToken.VALUE_NUMBER_INT) {
            return Convert.convert(fieldType, p.getIntValue());
        }
        if (currentToken == JsonToken.START_ARRAY) {
            List<Object> list = new ArrayList<>();
            while (p.nextToken() != JsonToken.END_ARRAY) {
                list.add(Convert.convert(fieldType, EncryptUtil.decryptMsg(p.getText())));
            }
            return list;
        }
        return null;
    }
}

2,在实体类上注解

@JsonDeserialize(using = BdipIdArgumentDeserialize.class)
Integer userId;

标签:null,JsonToken,spring,JSON,fieldType,parsingContext,序列化,public
From: https://www.cnblogs.com/cnff/p/17077262.html

相关文章

  • spring-HandlerMethodArgumentResolver-参数解析器
    1,参数解析器介绍  HandlerMehtodArgumentResolver,中文成为方法参数解析器,是SpringMvc组件的众多解析器之一,主要用来对Controller的方法参数进行处理。2,参数解析器的使用1,实现HandlerMethodArgumentResolver,自定义解析器publicclassMyHandlerMethodArgumentResolver......
  • Spring-@Validated-参数校验
    1.什么是javax.validationJSR303是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面(面向注解编程的时代),就可以在需要校验的时候进行校验了,在SpringBoot中已经包含在starter-web中,再其他项目中可以引用依赖,并自行......
  • Springcloud Alibaba-8-链路追踪
    1.基本概念在微服务架构中,一个请求可能需要调用很多个服务,若其中出现了错误很难去定位。链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等......
  • Spring反序列化失败 Type definition error: [simple type, class xxx.xxx.xxx]
    也许更好的阅读体验Typedefinitionerror:[simpletype,classcom.elm.po.CommonResult];nestedexceptioniscom.fasterxml.jackson.databind.exc.InvalidDefinitionException:Cannotconstructinstanceofcom.elm.po.CommonResult(noCreators,likedefaultconstru......
  • SpringBoot使用外部Web容器的解决方案
    SpringBoot默认内嵌了Web容器(如Tomcat、Jetty或Undertow),这使得应用可以作为独立的可执行JAR或WAR文件运行,无需外部Web容器。然而,在某些情况下,你可能想要将SpringBoot应用部署到外部的Web容器中,比如ApacheTomcat或Jetty。嵌入式的Web容器:应用可以打包成可执行的Jar。优点:简单......
  • META-INF/spring.factories自动化配置
    META-INF/spring.factories文件是SpringBoot项目中非常重要的一个文件,用于声明各种自动配置类、监听器、初始化器等。这个文件通常用来启用和配置各种SpringBoot自动配置模块。具体来说,spring.factories文件采用Java的属性文件格式,其中包含了多个键值对,每个键代表一个......
  • 玩转SpringBoot:SpringBoot的几种定时任务实现方式
    引言在现代软件开发中,定时任务是一种常见的需求,用于执行周期性的任务或在特定的时间点执行任务。这些任务可能涉及数据同步、数据备份、报表生成、缓存刷新等方面,对系统的稳定性和可靠性有着重要的影响。SpringBoot提供了强大且简单的定时任务功能,使开发人员能够轻松地管理和执......
  • 盘点一个Pandas处理json数据的实战案例
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【黑科技·鼓包】问了一个Pandas处理json数据的问题。问题如下:大佬们请教下一个很简单的问题,因为我半瓢水也不知道该怎么解决,问AI好像也写不好描述,麻烦帮忙看看呗?如下json用df写的话是两列,然后写df=df[row]会变一......
  • spring - string
    spring-string1.string在Java8及之前的版本中,字符串由不可变的Unicode字符数组组成。然而,大多数字符只需要8位(1个字节)来表示它们,而不是16位(字符大小)。为了改善内存消耗和性能,Java9引入了紧凑字符串。这意味着如果字符串仅包含1字节字符,它将使用Latin-1编码表示......
  • 从零开始搭建Springboot开发环境(Java8+Git+Maven+MySQL+Idea)之一步到位
    说明所谓万事开头难,对于初学Java和Springboot框架的小伙伴往往会花不少时间在开发环境搭建上面。究其原因其实还是不熟悉,作为在IT界摸爬滚打数年的老司机,对于各种开发环境搭建已经了然于胸,自己当年也是这么过来的。今天我就毕其功于一役,解放大家的时间,让凡人的环境配置见鬼去吧......