前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >按层级/条件解析Json,获取相应的key或value中的相关数据

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

作者头像
wuweixiang
发布2018-08-14 11:36:55
3.9K0
发布2018-08-14 11:36:55
举报
文章被收录于专栏:吴伟祥
代码语言:javascript
复制
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;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/08/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档