专栏首页吴伟祥按层级/条件解析Json,获取相应的key或value中的相关数据

按层级/条件解析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 条评论
登录 后参与评论

相关文章

  • 关于“分类”的应用 原

    三、SQL中区分类别的过滤条件:比如取分类2,那么就是 2=2 <![CDATA[ & ]]>type

    wuweixiang
  • java模拟登陆爬虫 原

    wuweixiang
  • 详解equals()方法和hashCode()方法

    Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和ha...

    wuweixiang
  • fastjson—Map和List对象间的转换

    fastjson 是阿里巴巴推出的,一个Java语言编写的高性能JSON 处理器,遵循JSON标准 http://json.org/ ,支持各种JDK 类型。...

    软测小生
  • 聊聊CarreraProducer的sendDelay

    DDMQ/carrera-sdk/producer/java/carrera-producer-sdk/src/main/java/com/xiaojukeji...

    codecraft
  • Flink从入门到放弃-Flink分布式缓存

    在用户函数中访问缓存文件或者目录(这里是一个map函数)。这个函数必须继承RichFunction,因为它需要使用RuntimeContext读取数据:

    王知无
  • String s=new String("abc")创建了几个对象?

    String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?

    week
  • 聊聊nacos NamingProxy的getServiceList

    nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy...

    codecraft
  • LeetCode 804 Unique Morse Code Words

    首先为每个单词的每个字符进行转码, 将转码后的数据放到 Set 集合中, 最后返回 Set 的长度。

    一份执着✘
  • Spring Boot系列 – 4. 读取配置文件(application.yml)中的属性值

    在spring boot中,简单几步,读取配置文件(application.yml)中各种不同类型的属性值: 1、引入依赖:

    Java架构师必看

扫码关注云+社区

领取腾讯云代金券