美文网首页
Fastjson json字符串怎样直接反序列化为对象

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

作者: 杭二 | 来源:发表于2024-10-15 10:55 被阅读0次

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

真实业务场景

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

@Data
public static class TestOuter {
    private Stirng bizJson;
}
@Data
public static class BizJson {
    private String name;
}
{
    "bizJson": "{\"name\":\"testName\"}"
}

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

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 的场景

方案思路

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

代码实现

@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);
}
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)

相关文章

  • fastjson详解

      fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBea...

  • FastJSON 使用小结

    1. JSON格式字符串转为别的对象 反序列化:反序列化就是把JSON格式的字符串转化为Java Bean对...

  • JSON处理

    fastjson json字符串转为json对象 将json字符串转为javabean对象 将map或者复杂对象转...

  • 在JavaScript中使用Json

    将json字符串转化为json对象: 将json对象转化为字符串

  • JSON

    parse:把字符串转化为JSON对象stringify:把JSON对象转化为字符串

  • 使用jackson转对象

    把json字符串转化为嵌套对象 把json字符串转化为对象数组

  • json反序列化之实体类、集合

    1、反序列化之json字符串转为java实体对象 2、 反序列化之json字符串转为java集合

  • 高性能JSON框架之FastJson的简单使用

    FastJson的用法 首先定义三个json格式的字符串 JSON格式字符串与JSON对象之间的转换 json字符...

  • Fastjson JSON 操作

    Fastjson JSON 操作 1. Java环境下使用 1.1 Json字符串转为json对象 将下面的jso...

  • 十一. fastjson的使用

    一 . 概述 fastjson出自于阿里巴巴, 用于将Java Bean序列化为JSON字符串,也可以从JSON字...

网友评论

      本文标题:Fastjson json字符串怎样直接反序列化为对象

      本文链接:https://www.haomeiwen.com/subject/rkqtdjtx.html