java实现类似Python的S["A"][0]["B"]去解析JSON,获取JSON的值

 python读取json如下,很便捷

#!/usr/bin/env python
#coding=utf-8
import json
fin =file(r"D:\ECMSDE\GTRECM\JavaExecutor\JavaEnvCfg\deployParameters.json","a+")
#content = fin.read()
s=json.load(fin)
print s["environment"]["instances"]["vms"][0]["eip"]

 控制台输出

C:\Python27\python.exe C:/Users/s00424093/PycharmProjects/pycharm/day/resource/Dependency/loadjson.py
100.115.143.159

Process finished with exit code 0

但是Java的很繁琐,所以实现了一个函数类似用python这种python去读取jsonvalue值的

java用 path的方式解析JSON

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.io.*;
import java.util.Iterator;
import java.util.Scanner;


public class JsonFile {
//读取json文件
    public static JSONObject getObj(String FilePath){
        JSONObject jsonObj = null;
        new Log("JsonFile.class");

        if(FilePath == null){
            System.out.println("json文件路径为空,请确认传入路径是否正确。");
            Log.logger.error("json文件路径为空,请确认传入路径是否正确。");
            return null;
        }else if(new File(FilePath).exists() == false){
            System.out.println("json文件不存在,请确认传入路径是否正确。");
            Log.logger.error("json文件不存在,请确认传入路径是否正确。");
            return null;
        }

        String data= new JsonFile().readFile(FilePath).toString();
        jsonObj  = JSONObject.fromObject(data);
        return jsonObj;
    }

    public StringBuilder readFile(String FilePath){
        StringBuilder buffer = new StringBuilder();
        File file = new File(FilePath);
        Scanner scanner = null;

        try {
            scanner = new Scanner(file, "utf-8");
            while (scanner.hasNextLine()) {
                buffer.append(scanner.nextLine());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (scanner != null) {
                scanner.close();
            }
        }
        return buffer;
    }

 
    public static String getDeepValue(String FilePath,String JsonPython){
        //用[\"instances\"][\"vms\",\"vms\"][0][\"eip\"]一样取json的值,默认初始以jsonobject开始不是jsonobject
        //校验Jsonpath
        if (!verifyForms(JsonPython)){
            return null;
        }
        JSONObject jsonObject = getObj(FilePath);
        JSONArray jsonArray = null ;
        if(null==jsonObject){
            return null;
        }
        //元素属性分类
        String[] elements = JsonPython.substring(1,JsonPython.length()-1).split("]\\[");
        String[][] elementsWithType = new String[elements.length][2];
        for(int i=0;i<elements.length;i++) {
            String e = elements[i];
            if (e.matches("^\"[^\"]+[\"$]")) {
                //元素为字符串,则为普通属性
                elementsWithType[i][0] = e.substring(1, e.length() - 1);
                elementsWithType[i][1] = "string";
            } else if (e.matches("\\d+")) {
                //元素为数字说明为数组
                elementsWithType[i][0] = e;
                elementsWithType[i][1] = "number";
            }
        }
       //取值
        for(int i=0;i<elements.length;i++) {
            String e = elementsWithType[i][0];
            String type = elementsWithType[i][1];
            String nextType = null;
            if (i < elements.length - 1) {
                nextType = elementsWithType[i + 1][1];
            }
            if ("string".equals(type)) {
                //元素为字符串,则为普通属性
                if (jsonArray != null) {
                    Log.logger.error("jsonPtah格式错误:json --->JsonArray `s element must be a number ,not string:" + e);
                    return null;
                }
                if (!jsonObject.has(e)) {
                    Log.logger.error("jsonPtah格式错误:json --->don`t have the key : " + e);
                    return null;
                }

                if ("string".equals(nextType)) {
                    jsonObject = jsonObject.getJSONObject(e);
                    jsonArray = null;
                } else if ("number".equals(nextType)) {
                    jsonArray = jsonObject.getJSONArray(e);
                    jsonObject = null;
                } else if(null == nextType){
                    Object o =jsonObject.get(e);
                    return o.toString();
                }
            } else if ("number".equals(type)) {
                //元素为数字说明为数组
                int n = Integer.parseInt(e);
                if (jsonObject != null) {
                    Log.logger.error("jsonPtah格式错误:json --->JsonObject `s element must be a string ,not number:" + e);
                    return null;
                }
                if (jsonArray.size() <= n) {
                    Log.logger.error("jsonPtah格式错误:json --->JsonArray`s index : " + n + " out of range : " + jsonArray.size());
                    return null;
                }
                if ("string".equals(nextType)) {
                    jsonObject = jsonArray.getJSONObject(n);
                    jsonArray = null;
                } else if ("number".equals(nextType)) {
                    jsonArray = jsonArray.getJSONArray(n);
                    jsonObject = null;
                } else if(null == nextType){
                    Object o =jsonArray.get(n);
                    return o.toString();
                }
            }
        }
            return jsonObject.toString();
    }
    private static boolean verifyForms(String JsonPython){
        new Log("JsonFile.class");
        //参数正确格式"[\"instances\"][\"vms\"][0][\"eip\"]"
        if("".equals(JsonPython)||null==JsonPython){
            Log.logger.error("jsonPtah格式错误:\""+JsonPython+"\" --->值为空或null");
            return false;
        }
        if(!JsonPython.startsWith("[")||!JsonPython.endsWith("]")){
            Log.logger.error("jsonPtah格式错误:\"" + JsonPython + "\" --->未以'['开始或未以'['结束");
            return false;
        }
        String[] elements =JsonPython.substring(1,JsonPython.length()-1).split("]\\[");
        for (String e:elements) {
            boolean isString=e.matches("^\"[^\"]+[\"$]");//必须以"开始和结束中间字符不能有"
            boolean isNumber=e.matches("\\d+");
            if(!isString&&!isNumber){
                Log.logger.error("jsonPtah格式错误:\"" + JsonPython + "\" --->[...]内元素值非法");
                return false;
            }
        }
        return true;
    }
    public static void main(String[] args){
        String r = getDeepValue("D:/ECMSDE/GTRECM/JavaExecutor/JavaEnvCfg/deployParameters.json","[\"environment\"][\"instances\"][\"vms\"][0][0][\"status\"]");
        System.out.println(r);
    }

控制台输出

猜你喜欢

转载自blog.csdn.net/wanxiaoderen/article/details/81511636