按层级/条件解析Json,获取相应的key或value中的相关数据

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.zhaogang.model.condition.UserCouponCondition;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Created by weixiang.wu on 2017/8/22.
 */
public class JsonAnalysisTest {

    private static final Logger logger = LoggerFactory.getLogger(JsonAnalysisTest.class);

    /**
     * Json格式如下:
     */
    //对象型
    private static final String JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";
    //数组类型
    private static final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";
    //复杂格式json字符串
    private static final String COMPLEX_JSON_STR = "{\"teacherName\":\"crystall\",\"teacherAge\":27,\"course\":{\"courseName\":\"english\",\"code\":1270},\"students\":[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]}";
    private static final String JSONSTR = "{\n" +
            "    \"code\": \"200\",\n" +
            "    \"code_desc\": [{\"2\":0,\"result_desc\":\"查到结果1\",\"test\":{\"3c\":\"1\",\"b\":\"3\"}},{\"2\":0,\"result_desc\":\"查到结果\"}],\n" +
            "    \"charge\": true,\n" +
            "    \"data\": { \n" +
            "    \"result_code\": 0,\n" +
            "         \"result_desc\": {\"result_code\":0,\"result_desc\":\"查到结果\"}\n" +
            "     }\n" +
            "}";

    /**
     * json字符串-简单对象型与JSONObject之间的转换
     */
    @Test
    public void testJSONStrToJSONObject() {
        JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
        //JSONObject jsonObject1 = JSONObject.parseObject(JSON_OBJ_STR); //因为JSONObject继承了JSON,所以这样也是可以的
        System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
    }

    /**
     * json字符串-数组类型与JSONArray之间的转换
     */
    @Test
    public void testJSONStrToJSONArray() {
        JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
        //JSONArray jsonArray1 = JSONArray.parseArray(JSON_ARRAY_STR);//因为JSONArray继承了JSON,所以这样也是可以的
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
        }
    }

    /**
     * 复杂json格式字符串与JSONObject之间的转换
     */
    @Test
    public void testComplexJSONStrToJSONObject() {
        JSONObject jsonObject = JSON.parseObject(COMPLEX_JSON_STR);
        //JSONObject jsonObject1 = JSONObject.parseObject(COMPLEX_JSON_STR);//因为JSONObject继承了JSON,所以这样也是可以的
        String teacherName = jsonObject.getString("teacherName");
        Integer teacherAge = jsonObject.getInteger("teacherAge");
        JSONObject course = jsonObject.getJSONObject("course");
        JSONArray students = jsonObject.getJSONArray("students");
    }

    private static <T> String[] analysisJsonByCondition(String jsonStr, String[] strings) {
        // 0.根据传过来的数据 用json自带方法进行解析
        // 1.根据条件依次解析
        return null;
    }


    /**
     * The entry point of application.
     */
    @Test
    public void testAnalysisJson() {
        UserCouponCondition t = new UserCouponCondition();
        analysis(JSONSTR, t);
    }

    /**
     * The Layer.
     */
    static int layer = 1;//默认为第一层级

    /**
     * 根据条件获取json中的<code>key</code>||<code>value</code>
     *
     * @param jsonStr   需要遍历的 Json字符串
     * @param condition 条件  <p>层级说明:以 "{" or "[{" 的开头 为一层级, 依次累加</p>
     * @param <T>       条件对象
     * @return
     */
    private static <T> String analysis(String jsonStr, T condition) {
        String value = null;
        String key = null;
        int j = 0;
        /**   todo  0. json 校验  */
        /**   1. 开始解析json字符串  */
        Map<String, String> jsonMap = JSON.parseObject(jsonStr, new TypeReference<LinkedHashMap<String, String>>() {
        });
        logger.info("我是第[{}]层", layer);
        for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
            j++;
            value = entry.getValue();
            key = entry.getKey();
//            if(layer==condition.getLayer()&&condition.get????==key){     // 如果符合条件
            logger.info(key + ":" + value);
//            return null;
//            }
        }
        if (j == jsonMap.size()) {
            layer++;
            for (Map.Entry<String, String> entry : jsonMap.entrySet()) {    //找出下一层以 "{" or "[{" 的  key'value
                value = entry.getValue();
                if (value != null && value.startsWith("{")) {
                    analysis(value, condition);
                }
                if (value != null && value.startsWith("[{")) {
                    String[] values = value.substring(1, value.length() - 1).replace("},", "}===").split("===");
                    for (String v : values) {
                        analysis(v, condition);
                    }
                }
            }
        }
        return null;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魂祭心

原 大数运算

35450
来自专栏码农阿宇

关于C#委托的一些学习笔记

1.什么是委托就是把方法作为参数传给另一个方法。委托说指向的函数,必须和函数具有相同的签名(返回值和参数类型) Public delegate void D...

28370
来自专栏一枝花算不算浪漫

List的多维度排序案例演示~

37170
来自专栏GreenLeaves

C#核编之内建数据类型

这个随笔中的重点之一是说明:C#中所提供的关键字都是相应系统类型的简化符号(如int是System.Int32类型的简化符号) 一、内建数据类型与层级结构 所有...

26060
来自专栏菩提树下的杨过

数据结构C#版笔记--双向链表(DbLinkList)

这是数据结构C#版笔记--线性表(Data Structure)之单链表(LinkList)的继续,对于双向链接,节点上除了Next属性外,还要有Prev属性用...

296100
来自专栏跟着阿笨一起玩NET

在C#中ParameterizedThreadStart和ThreadStart区别

11410
来自专栏大内老A

由for V.S. for each想到的

一直想写一系列如何提高Performance和Scalability的文章,把我的相关经验和所知道的相关的技巧同大家分享。前一阵在园子里有一篇讨论for eac...

20480
来自专栏蓝天

查看Redis集群所有节点内存工具

指定集群中任意一个节点,查看集群中所有节点当前已用物理内存、配置的最大物理内存和系统物理内存。 源码(可从下载):

36340
来自专栏菩提树下的杨过

[原创]Func〈T, TResult〉 泛型委托 以及演变历程(整理自MSDN)

以下内容为菩提树下的杨过根据微软MSDN整理,转贴请注明出处 MSDN对于Func<T, TResult>)的官方解释: 封装一个具有一个参数并返回 ...

22770
来自专栏个人随笔

使用集合组织相关数据

一.集合概述   特点:可动态扩容   1.ArrayList(数组列表)     类似于数组,可动态维护     命名空间:System.Collection...

31080

扫码关注云+社区

领取腾讯云代金券