[代码段] fastjson2 嵌套类型解析 子类型解析

技术实战 技术实战 7729 人阅读 | 0 人回复

Json是现在最常用的数据交互方式之一,经常需要面临Json数据解析的问题。

那么如何使用解析工具,针对结果的包装类型或者嵌套的类型进行解析呢?

不确定具体的子类型,如何进行处理?

如果嵌套的类型并不清楚具体的类型是什么,终归是要想办法知道的,否则,就没有办法解析。

之前有过一篇Json解析方面的文章

https://crazybytex.com/thread-89-1-1.html

今天主要介绍的是另外的处理形式。

比如

image.png

对于子类型,可以通过额外的字段进行标记,形成key-value的形式,参数传递的时候,能够获得一个唯一的标志符

通过这个唯一的标志符,Java代码中,通过Map或者任何形式,能够拿到对应的Class对象

就可以进一步进行处理。

代码样例记录如下:

数据封装类

type就是标志符,实际的数据是data区域

package com.crazybytex.fragment.jsontyperesolver;

/**
 * @description
 * @Author 本文作者 程序员潇然 疯狂的字节X https://www.crazybytex.com/
 * @Date 2022/7/29 10:39
 * @Description 见Tester 注释
 **/
public class MessageWrapper {
    private Message data;

    private String type;

    public Message getData() {
        return data;
    }

    public void setData(Message data) {
        this.data = data;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("MessageWrapper{");
        sb.append("data=").append(data);
        sb.append(", type='").append(type).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

类型映射

package com.crazybytex.fragment.jsontyperesolver;

import java.util.HashMap;
import java.util.Map;

/**
 * @description
 * @Author 本文作者 程序员潇然 疯狂的字节X https://www.crazybytex.com/
 * @Date 2022/7/29 10:10
 * @Description 见Tester 注释
 **/
public class TypeMapperMap {

    public static final Map<String, Class<? extends Message>> FRAME_HOLDER = new HashMap<>();

    static {
        FRAME_HOLDER.put("1", Message1.class);
        FRAME_HOLDER.put("2", Message2.class);
    }

    public static Class<? extends Message> type(String packageType) {

        return FRAME_HOLDER.get(packageType);
    }

}

测试类

package com.crazybytex.fragment.jsontyperesolver;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

/**
 * @description
 * @Author 本文作者 程序员潇然 疯狂的字节X https://www.crazybytex.com/
 * @Date 2022/7/29 10:43
 * @Description 用来记录 FastJson2 针对不用的子类型的解析
 * <p>
 * 对于常用的返回结果,通常是下面的这种形式,或者是嵌套的类型都可以使用
 * <p>
 * 借助于 MessageWrapper 封装类型,和实际的数据
 * 格式为
 * type和data
 * type 用于类型标记,简单说就是可以根据这个值找到具体的类型, 比如可以通过配置,通过map进行获取等等,总之能找到具体子类型就可以
 * 比如我使用的就是map  详情见 TypeMapperMap
 * data是具体子类型的数据的json部分,这里面的所有的字段才是真正的数据
 * {
 * "data": {
 * "code": "2",
 * "message2": "msg2  2",
 * "message2Other": "meg2-other",
 * "msg": "msg0-2"
 * data里面的内容无所谓,只要是对应的子类型的json数据即可
 * },
 * "type": "2"
 * }
 * <p>
 * 思路就是分两次解析
 * 第一次解析,结果为MessageWrapper,这样里面的type字段就可以拿到了
 * 第二次获取JSONObject中的data字段的属性,解析为对应的子类型即可
 **/
public class Tester {
    public static void main(String[] args) {

         /*
        {"code":"0","msg":"message "}
        {"code":"1","message1":"msg1  1","msg":"msg0-1"}
        {"code":"2","message2":"msg2  2","message2Other":"meg2-other","msg":"msg0-2"}
        * */
        String testJsonString1 = "{\n" +
                "\t\"data\": {\n" +
                "\t\t\"code\": \"1\",\n" +
                "\t\t\"message1\": \"msg1  1\",\n" +
                "\t\t\"msg\": \"msg0-1\"\n" +
                "\t},\n" +
                "\t\"type\": \"1\"\n" +
                "}";


        String testJsonString2 = "{\"data\":{\"code\":\"2\",\"message2\":\"msg2  2\",\"message2Other\":\"meg2-other\",\"msg\":\"msg0-2\"},\"type\":\"2\"}";


        String test = testJsonString2;

        /*************************************************/

        MessageWrapper messageWrapper = JSON.parseObject(test, MessageWrapper.class);

        JSONObject jsonObject = JSON.parseObject(test);
        Message message = jsonObject.getObject("data", TypeMapperMap.type(messageWrapper.getType()));
        messageWrapper.setData(message);
        //可以看到已经变为具体的类型了,还可以根据具体的子类型进行不同的逻辑处理
        if (messageWrapper.getData() instanceof Message1) {
            System.out.println("处理消息类型1" + messageWrapper);
        } else if (messageWrapper.getData() instanceof Message2) {
            System.out.println("处理消息类型2" + messageWrapper);
        }

    }
}

完整代码如下:

https://gitee.com/crazybytex/java-code-fragment/tree/master/src/main/java/com/crazybytex/fragment/jsontyperesolver

简单说就是经过多次解析,进行处理。

common_log.png 转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-103-1-1.html

关注下面的标签,发现更多相似文章
    黄小斜学Java

    疯狂的字节X

  • 目前专注于分享Java领域干货,公众号同步更新。原创以及收集整理,把最好的留下。
    包括但不限于JVM、计算机科学、算法、数据库、分布式、Spring全家桶、微服务、高并发、Docker容器、ELK、大数据等相关知识,一起进步,一起成长。
热门推荐
海康摄像头接入 wvp-GB28181-pro平台测试验
[md]### 简介 开箱即用的28181协议视频平台 `https://github.c
[CXX1300] CMake '3.18.1' was not
[md][CXX1300] CMake '3.18.1' was not found in SDK, PATH, or
[若依]微服务springcloud版新建增添加一个
[md]若依框架是一个比较出名的后台管理系统,有多个不同版本。