**
~~json求取多重数组嵌套中对象的值~
**
首先先给大家看一下我项目拿到的json格式
看上去有木有感觉到很复杂,数组不仅有没有键的值还有对象,这种混合型数据每次都需要拿出一条数据来使用,如果光把数据显示出来那很容易,主要还需要单独应用,这可愁坏了我这种刚入门的it工作者。.
我当时想到的办法就是将对象转换为map,然后将数组中没有键的对象放到list中,list中嵌套map将数据return出去虽然可以实现将每个值单独取出来但是这种方式有有很多弊端,比如如果获取的list需要通过下标去获取值,那样很难保证数据的可变性。
最后想到的办法是使用实体类进行实现
这是我定的json总体的实体类,但是数组中的数据才是硬伤,随后我又特地为json数组中做了一个实体类。放入list中
将数组中可变的元素和没有键的元素也统统加了进去,现在万事俱备只欠数据啦。接下来就是从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实体类获取要用的值了