@JsonSerialize和@JsonDeserialize注解详解

本文介绍了如何使用Spring的@JsonSerialize和@JsonDeserialize注解来简化JSON数据在前端与后端之间的转换。在处理前端发送的JsonArray到后端存储为字符串,以及查询后将数据库中的字符串转换回JsonArray时,这两个注解可以避免复杂的特殊处理,提供了一种优雅的解决方案。
  1. 背景:前端传输一个JsonArray到后端,我需要变成json 字符串存入数据库;在查询的时候我需要从数据库查询出来然后返回给前端一个jsonArray。如果用传统方式需要复杂的特殊处理,spring提供了JsonSerialize和JsonDeserialize注解来优雅的解决这个问题
  2. 步骤
  • 定义序列化和反序列化处理对象
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

/**
 * FrogTask中客户端字段自定义的序列化处理类
 * @author ruiclear
 * @date 2020-07-28 10:40
 */
public class TerminalSerialize extends JsonSerializer<String> {

    private Gson gson = new Gson();
    /**
     * Method that can be called to ask implementation to serialize
     * values of type this serializer handles.
     *
     * @param value       Value to serialize; can <b>not</b> be null.
     * @param gen         Generator used to output resulting Json content
     * @param serializers Provider that can be used to get serializers for
     */
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {

        Type typeOfT = new TypeToken<List<Map<String, Object>>>(){}.getType();
        List<Map<String, Object>> list= gson.fromJson(value,  typeOfT);

        gen.writeObject(list);

    }
}
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.node.ArrayNode;

import java.io.IOException;

/**
 * FrogTask中客户端字段自定义的反序列化处理类
 * @author ruiclear
 * @date 2020-07-28 10:40
 */
public class TerminalDeserialize extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {

        TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);

        ArrayNode arrayNode = (ArrayNode)treeNode;
        return arrayNode.toString();
    }
}
  • 在bean上使用注解,前端JsonArray到controller时解析terminal字段时会调用TerminalDeserialize进行自定义处理,在查询时会调用TerminalSerialize处理
    @JsonSerialize(using = TerminalSerialize.class)
    @JsonDeserialize(using = TerminalDeserialize.class)
    private String terminal;     //客户端类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值