将json转换为数据结构体

Posted 南墙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将json转换为数据结构体相关的知识,希望对你有一定的参考价值。

主要用到的依赖:(划重点:这个依赖需要加jdk版本号,不加的话用不了,且目前最高是jdk15)

(ps: 用于json与其他类型格式转换,JSONObject, JSONArray等来自这个包)

    <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
    <dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
        <classifier>jdk15</classifier>
    </dependency>

 

核心代码:

package cn.ucmed.pangu.lib;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConvertTool {

    public static List<BaseNode> analysisRequestJson(Object json) {
        List<BaseNode> baseNodeList = new ArrayList<>();
        NodeContainer nodeContainer = new NodeContainer(null, null, null, null);
        if (json instanceof JSONArray) {
            JSONArray jsonArray = (JSONArray) json;
            jsonArray.forEach(j -> analysisRequestJson(j));
        } else if (json instanceof JSONObject) {
            JSONObject jsonObject = (JSONObject) json;
            Iterator iterator = jsonObject.keys();
            while (iterator.hasNext()) {
                String key = iterator.next().toString();
                Object o = ((JSONObject) json).get(key);
                if (o instanceof JSONArray) {
                    JSONArray jsonArray = (JSONArray) o;
                    analysisRequestJson(jsonArray);
                } else if (o instanceof JSONObject) {
                    List<BaseNode> list = analysisRequestJson((JSONObject) o);
                    nodeContainer = new NodeContainer(key, null, list);
                } else {
                    baseNodeList.add(new NodeLeafConstant(key, o.toString(), o.getClass().getTypeName().replace("java.lang.", "")));
                }
            }
            if (CollectionUtils.isNotEmpty(nodeContainer.nodeList)) {
                baseNodeList.add(nodeContainer);
            }
        }
        return baseNodeList;
    }
}

测试用例:

package cn.ucmed.pangu.test;

import cn.ucmed.pangu.lib.ConvertTool;
import cn.ucmed.pangu.lib.NodeContainer;
import cn.ucmed.pangu.lib.NodeLeafConstant;
import net.sf.json.JSONObject;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.Arrays;

@RunWith(SpringRunner.class)
public class ConvertToolTest {

    public static String jsonStr = "{
" +
            "    "app_id":"zsyy_android",
" +
            "    "app_key":"ZW5sNWVWOWhibVJ5YjJsaw==",
" +
            "    "coder":"enNseVpXNXNOV1ZXT1doaWJWSjVZakpzYXc9PQ",
" +
            "    "api_name":"api.nuts.invoker",
" +
            "    "data":{
" +
            "        "invoker_content":{
" +
            "            "apiId":"QueryDeptSchema",
" +
            "            "UseWay":"卓健",
" +
            "            "TransCode":"2004",
" +
            "            "UserId":"ZJYY",
" +
            "            "DeptCode":"1014",
" +
            "            "SeeDate":"2018-7-1",
" +
            "            "EndDate":"2018-7-5"
" +
            "        }
" +
            "    }
" +
            "}";

    public static NodeContainer expectedNodeContainer = new NodeContainer(new ArrayList<>(Arrays.asList(
            new NodeLeafConstant("app_id", "zsyy_android", "String"),
            new NodeLeafConstant("app_key", "ZW5sNWVWOWhibVJ5YjJsaw==", "String"),
            new NodeLeafConstant("coder", "enNseVpXNXNOV1ZXT1doaWJWSjVZakpzYXc9PQ", "String"),
            new NodeLeafConstant("api_name", "api.nuts.invoker", "String"),
            new NodeContainer("data", null, Arrays.asList(
                    new NodeContainer("invoker_content", null, Arrays.asList(
                            new NodeLeafConstant("apiId", "QueryDeptSchema", "String"),
                            new NodeLeafConstant("UseWay", "卓健", "String"),
                            new NodeLeafConstant("TransCode", "2004", "String"),
                            new NodeLeafConstant("UserId", "ZJYY", "String"),
                            new NodeLeafConstant("DeptCode", "1014", "String"),
                            new NodeLeafConstant("SeeDate", "2018-7-1", "String"),
                            new NodeLeafConstant("EndDate", "2018-7-5", "String")
                    ))
            ))
    )));

    @Test
    public void test() {
        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
        NodeContainer requestNode = new NodeContainer(new ArrayList<>(ConvertTool.analysisRequestJson(jsonObject)));
        Assert.assertEquals(requestNode.toString(), expectedNodeContainer.toString());
    }
}

 

以上是关于将json转换为数据结构体的主要内容,如果未能解决你的问题,请参考以下文章

将函数指针的 C 结构体转换为 JNA 代码

【golang】结构体与json相互转换,map与json相互转换

Golang中函数结构体,将函数转换为接口

实用代码片段将json数据绑定到html元素 (转)

HTML Bookmarklet模板:将任何JavaScript代码片段转换为Bookmarklet

结合两个代码片段?将用户输入的 Youtube url 转换为嵌入 url,然后将 iframe src 替换为转换后的 url