使用gson定制化序列化/反序列化

最近接到一个需求,要求只JSON序列化简单类型字段,复杂类型字段直接忽略。我这不想到了Gson的json适配器么。这里记录下

java 复制代码
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import lombok.Data;

import java.io.IOException;
import java.util.List;
import java.util.Map;

@Data
public class OrderDto {

    private String orderId;

    private List<OrderTicketDto> tickets;

    @Data
    @JsonAdapter(OrderTicketDtoTypeAdapter.class)
    public static class OrderTicketDto{

        private Map<String,Object> ticketWrapper;

    }

    static class OrderTicketDtoTypeAdapter extends TypeAdapter<OrderTicketDto> {

        @Override
        public void write(JsonWriter out, OrderTicketDto value) throws IOException {
            out.beginObject();
            if (value.getTicketWrapper() != null) {
                for (Map.Entry<String, Object> entry : value.getTicketWrapper().entrySet()) {
                    String key = entry.getKey();
                    Object val = entry.getValue();
                    boolean isSimpleType = val instanceof String || val instanceof Number || val instanceof Boolean;
                    if (isSimpleType) {
                        out.name(key);
                        if (val instanceof String) {
                            out.value((String) val);
                        } else if (val instanceof Number) {
                            out.value((Number) val);
                        } else if (val instanceof Boolean) {
                            out.value((Boolean) val);
                        } else {
                            out.nullValue();
                        }
                    }
                }
            }
            out.endObject();
        }

        @Override
        public OrderTicketDto read(JsonReader in) throws IOException {
            OrderTicketDto ticketDto = new OrderTicketDto();
            Map<String, Object> ticketWrapper = new java.util.HashMap<>();
            
            in.beginObject();
            while (in.hasNext()) {
                String name = in.nextName();
                switch (in.peek()){
                    case STRING:
                        ticketWrapper.put(name, in.nextString());
                        break;
                    case NUMBER:
                        ticketWrapper.put(name, in.nextDouble());
                        break;
                    case BOOLEAN:
                        ticketWrapper.put(name, in.nextBoolean());
                        break;
                    default:
                        in.skipValue();
                        break;
                }

            }
            in.endObject();
            
            ticketDto.setTicketWrapper(ticketWrapper);
            return ticketDto;
        }
    }
}
相关推荐
血小板要健康3 分钟前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
坐吃山猪3 分钟前
【多线程】CompletableFuture使用
java·开发语言·多线程
m0_5873830021 分钟前
点餐预约核销系统的架构脉络
java·架构·系统架构·需求分析
代码方舟1 小时前
O2O二手车交易平台B端车商管理后台:基于天远车信盟出险构建自动化车况评估网关
java·运维·人工智能·自动化
爱学堂IT分享1 小时前
图灵Java互联网架构师六期
java·开发语言
坐吃山猪1 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程
秋名RG1 小时前
Java 核心特性一览
java·开发语言
霸道流氓气质1 小时前
Spring AI 技术细节:RAG QuestionAnswerAdvisor 设计与实现
java·人工智能·spring
斑马1392 小时前
Linux软件编程学习笔记(十二)——TCP并发服务器模型
java·服务器·网络
冬栈程序设计2 小时前
Springboot宿舍管理系统【670099】 -附源码(开箱即用)
java·毕业设计·springboot·课程设计·程序设计·大作业