1,首先读取json文件
1)json数据类型 {“a”:“一”,“b”:[“c”,“d”],“e”:[{“f”:“g”,“h”:“i”},{“j”:“k”}]}
2)java代码
//读取JSON文件
public static String readJsonFile(String fileName) {
String jsonStr ="";
try {
File jsonFile = new File(fileName);
FileReader fileReader = new FileReader(jsonFile);
Reader reader = new InputStreamReader(new FileInputStream(jsonFile),"utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
fileReader.close();
reader.close();
jsonStr = sb.toString();
//jsonStr的首字符是空格,这应该是文件本身的问题,所以去除之(埋个坑,也可能是文件读取的机制问题,以后空了再看看)
jsonStr = jsonStr.substring(1,jsonStr.length());//左闭右开
return jsonStr;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
读取完以后返回json字符串
2,开始解析
public void test1(String json) throws JSONException {
//存放结果
List<Map<String,String>> lists = new ArrayList<>();
//根据json字符串创建json对象
JSONObject jObject1 = new JSONObject(json);
//生成索引的迭代器
Iterator<String> iterator1 = jObject1.keys();
while (iterator1.hasNext()) {
//得到索引值,和值
String key = iterator1.next();
String value = jObject1.getString(key);
//解析数组类型的值,为了解析出所有的数组类型
//注意,下面的代码并不是解析json的通用代码,而是
//根据具体的json数据定制的
//如果键值是一个数组的话就要判断一下,看是否里面还有
//json对象
if (value.startsWith("[")) {
JSONArray jsonArray = jObject1.getJSONArray(key);
if(jsonArray.toString().charAt(1)=='"'){
Map<String,String> map = new HashMap<>();
//这里不用map直接存键值对是因为map会自动消除重复的key,所以采用数组的方式
map.put(key,value);
lists.add(map);
}
else if(jsonArray.toString().charAt(1)=='{'){
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject sonObject = jsonArray.getJSONObject(i);
Iterator<String> iterator2 = sonObject.keys();
while (iterator2.hasNext()) {
//得到索引值,和值
String key2 = iterator2.next();
String value2 = sonObject.getString(key2);
Map<String,String> map = new HashMap<>();
map.put(key2,value2);
lists.add(map);
}
}
}
}
else {
Map<String,String> map = new HashMap<>();
map.put(key,value);
lists.add(map);
}
}
int i=0;
//遍历读取lists里面的值
for (Map<String,String> list : lists) {
for(Map.Entry<String,String> res:list.entrySet()){
System.out.println("第"+i+"项内容:"+res.getKey()+"->"+res.getValue());
i++;
}
}
}
3,js版本
//json是json字符串,用$.parseJSON解析为对象
var obj = $.parseJSON(json)
//lists存储结果
var lists = []
for(var item in obj){
//这里是判断读取的第一层键值是否为对象,且是一个包含json对象的数组对象
if((typeof obj[item] == 'object') && JSON.stringify(obj[item]).indexOf('{') == 1){
//遍历数组里面的json对象,也就是遍历[{key:value},{..},{..}]这样的数据
for (var i = 0 ; i < obj[item].length; i++) {
//遍历一个对象中的键值
for (var subItem in obj[item][i]) {
var map = new Map()
map.set(subItem,obj[item][i][subItem])
lists.push(map);
}
}
//跳过余下的语句,从对应的for循环再次运行
continue;
}
//存储一般的数据
var map = new Map();
map.set(item,obj[item])
lists.push(map)
}
//打印内容
for(var j=0;j<lists.length;j++){
lists[j].forEach(function (value, key, map) {
console.log("第"+j+"项内容:"+key+"->"+value) })
}
运行效果(数据为没有意义的虚拟数据):