**

~~json求取多重数组嵌套中对象的值~

**

首先先给大家看一下我项目拿到的json格式

Java 多层json字符串生成对象 多层json数组取值_Java 多层json字符串生成对象

看上去有木有感觉到很复杂,数组不仅有没有键的值还有对象,这种混合型数据每次都需要拿出一条数据来使用,如果光把数据显示出来那很容易,主要还需要单独应用,这可愁坏了我这种刚入门的it工作者。.

我当时想到的办法就是将对象转换为map,然后将数组中没有键的对象放到list中,list中嵌套map将数据return出去虽然可以实现将每个值单独取出来但是这种方式有有很多弊端,比如如果获取的list需要通过下标去获取值,那样很难保证数据的可变性。

最后想到的办法是使用实体类进行实现

Java 多层json字符串生成对象 多层json数组取值_json格式_02


这是我定的json总体的实体类,但是数组中的数据才是硬伤,随后我又特地为json数组中做了一个实体类。放入list中

Java 多层json字符串生成对象 多层json数组取值_json格式_03


将数组中可变的元素和没有键的元素也统统加了进去,现在万事俱备只欠数据啦。接下来就是从json中取出数据。

由于我的json文件有很多而且需要全部实现,我就先做了一个检索工具,检索特定文件夹下的所有文件路径,把检索到的路径遍历出来进行json提炼

public static String readFile(String fileName) {

		//log.info("start");
		String jsonStr = "";

        try {
            File jsonFile = new File(fileName);
            checkFile(jsonFile);
            FileReader fileReader = new FileReader(jsonFile);
            FileInputStream input = new FileInputStream(jsonFile);
            Reader reader = new InputStreamReader(input, CHARSET.toString());
            int ch = 0;
            StringBuffer sb = new StringBuffer();
            while ((ch = reader.read()) != -1) {
                sb.append((char) ch);
            }

            fileReader.close();
            reader.close();
            jsonStr = sb.toString();

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        //log.info("end");
        return jsonStr;

    }

将json读出来之后其实和读那些txt呀什么的方式一样到最后都是转成了二进制字节流,将这些获取到的文本转换成JSON文件需要转换一下
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
现在就是json形式的数据了,如果只json只有对象可以通过
jsonObject.get(“键值”)获取数据,如果想获取数组可以通过jsonObject.getJSONArray(“数组键”)获取键值对应数组。
获取复杂的数据形式就要将这两种形式组合起来,接下来给大家分享,我通过实体类是如何获取负载的数据形式的。

/**
 * JSON数据分离和获取
 * @paramjsonStr
 * @return
 * @Auther 西西
 */
	public static CloudWatchAPIParamJsonEntity jsonFileAnalysis(String jsonStr) {
	CloudWatchAPIParamJsonEntity jsonFile = new CloudWatchAPIParamJsonEntity();//json对应实体
	List<MetricsEntity> metricsEntityList = new ArrayList<MetricsEntity>();//json数组对应实体

    try {

        JSONObject jsonObject  = JSONObject.fromObject(jsonStr);

        //Json銈儢銈搞偋銈儓銇嬨倝闋呯洰銈掑彇寰椼仚銈�
        jsonFile.setServerType((String) jsonObject.get("serverType"));
        jsonFile.setAccessKey((String) jsonObject.get("accessKey"));
        jsonFile.setSecretKey((String) jsonObject.get("secretKey"));
        jsonFile.setNameSpace((String) jsonObject.get("nameSpace"));

        JSONArray  metricsList = jsonObject.getJSONArray("metrics");

        for (int i = 0 ; i < metricsList.size();i++){

        	MetricsEntity metricsEntity = new MetricsEntity();

        	JSONArray recode = metricsList.getJSONArray(i);

        	int count = recode.size();

        	//銉囥兗銈裤偒銈︺兂銉堛倛銈娿�併儜銈裤兗銉冲寲鍑︾悊銈掕銇嗐��
        	JSONObject property = new JSONObject();
        	switch(count){
    		  case 2:
    			  metricsEntity.setMetricsID(recode.getString(0));

                  property = (JSONObject)recode.get(1);
                  metricsEntity.setStatistics((String) property.get("statistics"));
                  metricsEntity.setPeriod((Integer) property.get("period"));
                  metricsEntity.setStartTime((String) property.get("startTime"));
                  metricsEntity.setEndTime((String) property.get("endTime"));
    			  break;
    		  case 4:
    			  metricsEntity.setMetricsID(recode.getString(0));
    			  metricsEntity.setDimensionsName1(recode.getString(1));
    			  metricsEntity.setDimensionsValue1(recode.getString(2));

      			  property = (JSONObject)recode.get(3);
      			  metricsEntity.setStatistics((String) property.get("statistics"));
      			  metricsEntity.setPeriod((Integer) property.get("period"));
      			  metricsEntity.setStartTime((String) property.get("startTime"));
      			  metricsEntity.setEndTime((String) property.get("endTime"));
      			  break;

    		  case 6:
    			  metricsEntity.setMetricsID(recode.getString(0));
    			  metricsEntity.setDimensionsName1(recode.getString(1));
    			  metricsEntity.setDimensionsValue1(recode.getString(2));
    			  metricsEntity.setDimensionsName2(recode.getString(3));
    			  metricsEntity.setDimensionsValue2(recode.getString(4));

      			  property = (JSONObject)recode.get(5);
      			  metricsEntity.setStatistics((String) property.get("statistics"));
      			  metricsEntity.setPeriod((Integer) property.get("period"));
      			  metricsEntity.setStartTime((String) property.get("startTime"));
      			  metricsEntity.setEndTime((String) property.get("endTime"));
                  break;

    		  default:
    			  return null;
    		}
        	metricsEntityList.add(metricsEntity);

        }

        jsonFile.setMetricsList(metricsEntityList);


    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

    //log.info("end");
    return jsonFile;

}

将数据处理好之后就可以get实体类获取要用的值了