JSON递归解析(一)

根据表达式递归解析json获取某个属性的值:

json示例:

{
    "root":[
        {
            "elementA":{
                "test":null
            },
            "elementBs":[
                {
                    "elementNo":"test01",
                    "elementName":"testName1",
                    "elementEvent":[
                        "event11","event12"
                    ]
                },
                {
                    "elementNo":"test02",
                    "elementName":"testName2",
                    "elementEvent":[
                        "event21","event22"
                    ]
                }
            ]
        },
        {
            "elementA":{
                "test":456
            },
            "elementBs":null
        }
    ]
}

表达式示例:

root[0].elementBs[0].elementNo

结果:

test01

json解析使用的是Gson,以下为代码:

    private static final Pattern regex1 = Pattern.compile("\\[([^}]*)\\]");
    /**
     * 根据param表达式递归获得json中的元素
     */
    public static JsonElement recursiveGetElement(final JsonElement json, String param){
        if (StringUtils.isBlank(param) || json==null){
            return null;
        }
        JsonElement temp =json;
        String[] split = param.split("\\.");

        for (int i = 0; i < split.length; i++) {
            if (temp==null){
                break;
            }
            temp= GsonUtil.getElement(temp, split[i]);
        }
        return temp;
    }
	
	public static JsonElement getElement(JsonElement json, String paramName){
        JsonElement jsonElement=null;
        String regEx= "^[A-Za-z_][A-Za-z0-9$*_]*\\[\\d+\\]";
        //匹配是否为数组元素
        boolean matches = paramName.matches(regEx);
        if (matches){
            //提取中括号中的索引
            Matcher matcher = regex1.matcher(paramName);
            String group=null;
            while (matcher.find()){
                group = matcher.group(1);
            }
            String index =group;

            if (StringUtils.isNotBlank(index)){
                JsonArray jsonArray=null;
                if (!json.isJsonArray()){
                    JsonObject asJsonObject = json.getAsJsonObject();
                    String substring = paramName.substring(0, paramName.length() - 3);
                    JsonElement element = asJsonObject.get(substring);
                     jsonArray= element.getAsJsonArray();
                }else {
                    jsonArray = json.getAsJsonArray();
                }

                jsonElement = jsonArray.get(Integer.parseInt(index));
            }
        }else {
            if (json.isJsonObject()){
                JsonObject jsonObject = json.getAsJsonObject();
                jsonElement = jsonObject.get(paramName);
            }
        }
        return jsonElement;
    }
	
	/**
     * 获得json元素的值
     */
    public static String getJsonValue(JsonElement jsonElement){
        String result=null;
        if (jsonElement!=null){
            if (jsonElement.isJsonPrimitive()){
                JsonPrimitive asJsonPrimitive = jsonElement.getAsJsonPrimitive();
                if (asJsonPrimitive.isString()){
                    result = asJsonPrimitive.getAsString();
                }else {
                    result = asJsonPrimitive.toString();
                }
            }else if (jsonElement.isJsonNull()){
               return null;
            }else {
                result = jsonElement.toString();
            }
        }
        return result;
    }

测试:

    public static void main(String[] args) {
        String json="{\n" +
                "    \"root\":[\n" +
                "        {\n" +
                "            \"elementA\":{\n" +
                "                \"test\":null\n" +
                "            },\n" +
                "            \"elementBs\":[\n" +
                "                {\n" +
                "                    \"elementNo\":\"test01\",\n" +
                "                    \"elementName\":\"testName1\",\n" +
                "                    \"elementEvent\":[\n" +
                "                        \"event11\",\"event12\"\n" +
                "                    ]\n" +
                "                },\n" +
                "                {\n" +
                "                    \"elementNo\":\"test02\",\n" +
                "                    \"elementName\":\"testName2\",\n" +
                "                    \"elementEvent\":[\n" +
                "                        \"event21\",\"event22\"\n" +
                "                    ]\n" +
                "                }\n" +
                "            ]\n" +
                "        },\n" +
                "        {\n" +
                "            \"elementA\":{\n" +
                "                \"test\":456\n" +
                "            },\n" +
                "            \"elementBs\":null\n" +
                "        }\n" +
                "    ]\n" +
                "}";
        JsonParser jsonParser = new JsonParser();
        final JsonElement jsonElement = jsonParser.parse(json);

        String param="root[0].elementBs[0].elementNo";
        JsonElement temp = GsonUtil.recursiveGetElement(jsonElement, param);

        String jsonValue = GsonUtil.getJsonValue(temp);
        System.out.println(jsonValue);
    }
posted @ 2021-07-23 11:44  li956a  阅读(778)  评论(0)    收藏  举报