Fastjson json字符串怎样直接反序列化为对象

该文章为原创(转载请注明出处):Fastjson json字符串怎样直接反序列化为对象? - 简书 (jianshu.com)

真实业务场景

因为某种原因(可能是前端定义、可能是远程调用外部已经定义),json接收过来是json字符串 希望在接受的时候直接能够反序列化为对象

java 复制代码
@Data
public static class TestOuter {
    private Stirng bizJson;
}
@Data
public static class BizJson {
    private String name;
}
json 复制代码
{
    "bizJson": "{\"name\":\"testName\"}"
}

上述案例,返回 我想要得到 BizJsonDTO对象只能手动处理

java 复制代码
public class Test {
    public static void main(String[] args) {
        TestOuter testOuter = JSON.parse("", TestOuter.class);
        String bizJsonString = testOuter.getBizJson();
        BizJson bizJson = JSON.parse(bizJsonString, BizJson.class);
        //...
    }
}

需要达成的目的

我希望第一次反序列化的时候就能够 得到BizJsonDTO,同时还能兼容 json 的场景

方案思路

实现一个 字符串的反序列化器

代码实现

java 复制代码
@Data
public static class TestOuter {
    @JSONField(deserializeUsing = JsonStringDeserializer.class)
    private BizJson bizJson;
}
@Data
public static class BizJson {
    private String name;
}
public static void main(String[] args) {
    // 字符串场景 bizJson = "{\"name\": \"123\"}"
    JSON.parseObject("{\"bizJson\": \"{\\\"name\\\": \\\"123\\\"}\"}", TestOuter.class);
    // 对象场景 bizJson = {"name": "123"}
    JSON.parseObject("{\"bizJson\": {\"name\": \"123\"}}", TestOuter.class);
}
java 复制代码
import java.lang.reflect.Type;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;

/**
 * 适用于:对应字段的值 非json对象 而是 json的字符串
 *
 * @author fuhangbo.hanger.uhfun
 **/
public class JsonStringDeserializer implements ObjectDeserializer {

    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        // json字符串场景
        if (parser.lexer.token() == LITERAL_STRING) {
            String jsonString = (String)parser.parse(fieldName);
            return JSON.parseObject(jsonString, type);
        }
        // json对象场景
        if (parser.lexer.token() == LBRACE) {
            return parser.parseObject(type, fieldName);
        }
        throw new UnsupportedOperationException();
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }
}

该文章为原创(转载请注明出处):Fastjson json字符串怎样直接反序列化为对象? - 简书 (jianshu.com)

相关推荐
南囝coding15 分钟前
关于我的第一个产品!
前端·后端·产品
北漂老男孩1 小时前
Spring Boot 自动配置深度解析:从源码结构到设计哲学
java·spring boot·后端
陈明勇1 小时前
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
人工智能·后端·mcp
小咕聊编程1 小时前
【含文档+PPT+源码】基于SpringBoot+Vue的移动台账管理系统
java·spring boot·后端
景天科技苑1 小时前
【Rust结构体】Rust结构体详解:从基础到高级应用
开发语言·后端·rust·结构体·关联函数·rust结构体·结构体方法
-曾牛1 小时前
Spring Boot常用注解详解:实例与核心概念
java·spring boot·后端·spring·java-ee·个人开发·spring boot 注解
得物技术2 小时前
得物业务参数配置中心架构综述
后端·架构
用户4099322502122 小时前
分层架构在博客评论功能中的应用与实现
后端·ai编程·trae
co松柏2 小时前
程序员必备——AI 画技术图技巧
前端·后端·ai编程
京东云开发者2 小时前
秒送LBS场景下的C端SOA服务容灾建设之-数据备份篇
后端