Gson使用@JsonAdapter自定义序列化简单demo

 

   <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

 

自定义序列化配置

DemoJsonAdapter.java

复制代码
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

public enum  DemoJsonAdapter implements TypeAdapterFactory {
    INSTANCE;

    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        final TypeAdapter<JsonObject> jsonAdapter = gson.getAdapter(JsonObject.class);
        return new TypeAdapter<T>() {
            /**
             * 序列化过程
             * @param out
             * @param value json内容
             * @throws IOException
             */
            @Override
            public void write(JsonWriter out, T value) throws IOException {
                TypeAdapter<T> delegateAdapter = (TypeAdapter<T>)  gson.getDelegateAdapter(DemoJsonAdapter.INSTANCE, TypeToken.get(value.getClass()));
                //获取json内容
                JsonObject tree = delegateAdapter.toJsonTree(value).getAsJsonObject();
                //给json内容增加一个属性
                tree.addProperty("self", "now");
                //返回出去,没有这个将不会返回
                jsonAdapter.write(out, tree);

            }

            /**
             * 反序列化
             * @param in
             * @return
             * @throws IOException
             */
            @Override
            public T read(JsonReader in) throws IOException {
                //获取的json
                JsonObject json = jsonAdapter.read(in);
                //去掉name属性
                json.remove("name");
                TypeAdapter<T> delegate = gson.getDelegateAdapter(DemoJsonAdapter.INSTANCE, type);
                return delegate.fromJsonTree(json);
            }
        };
    }
}
复制代码

 

 

 

 

序列化的实体对象

DemoEntity.class

复制代码
import com.example.demo.json.DemoJsonAdapter;
import com.google.gson.annotations.JsonAdapter;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
@JsonAdapter(DemoJsonAdapter.class)
public class DemoEntity {

    private Integer id;

    private String name;

    private Boolean bool;
}
复制代码

 

 

测试

复制代码
public static void main(String []args) {
        DemoEntity entity=new DemoEntity();
        entity.setId(1)
                .setName("name")
                .setBool(false);

        Gson gson=new Gson();
        String toJson = gson.toJson(entity);
        System.out.println(toJson);

        DemoEntity fromJson = gson.fromJson(toJson, DemoEntity.class);
        System.out.println(fromJson);
    }
复制代码

 

posted @   yvioo  阅读(998)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2020-06-02 JAVA实现调用默认浏览器打开网页
点击右上角即可分享
微信分享提示