package net.liuyx.test;
import java.util.HashMap;
import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* 该工具将json的层次以url的形式组合成key,然后一层一层地剥,把最底层的value值放在map中。
* 如 interface/product/key, value这样的组合,通过查看key就可以知道json本来的层次感
* 解析jsonArray的时候,会连续出现两个数字隔开的情况,如1/2/key,这便是第一个JSONArray
* 底下第二个元素(该元素是JSONArray),在第二个元素底下第三个元素的key值,如此,通过正则表达式
* 也可知道处理的层次json是属于JSONArray还是JSONObject。
* @author user
*
*/
public class JSONParse {
private HashMap<String, String> jsonMap = new HashMap<String, String>();
private int layer;
public void parseJson(JSONObject jsonObject) {
parseJson(jsonObject, null);
}
private void parseJson(JSONObject jsonObject, String appendKey){
if (jsonObject == null)
return;
@SuppressWarnings("unchecked")
Iterator<String> it = jsonObject.keys();
while (it.hasNext()) {
String key = it.next();
JSONArray array = jsonObject.optJSONArray(key);
if(appendKey == null)
appendKey = key;
else
appendKey = appendKey + "/" + key;
if (array == null){
String value = jsonObject.optString(key);
if(value != null && !value.contains("{")){
jsonMap.put(appendKey, value);
}else{
parseJson(getJSONObject(value),appendKey);
}
}
else {
parseJsonArray(array, -1,layer);
}
}
}
private JSONObject getJSONObject(String json){
try {
JSONObject result = new JSONObject(json);
return result;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* 当index为-1时,表示没有进行jsonArray迭代
* @param array
* @param index
* @param layer
* @return
*/
private int parseJsonArray(JSONArray array, int index,int layer) {
if (array == null)
return layer;
int lastLayer = layer++;
int len = array.length();
for (int i = 0; i < len; i++) {
JSONObject obj = (JSONObject) array.opt(i);
@SuppressWarnings("unchecked")
Iterator<String> it = obj.keys();
while (it.hasNext()) {
String key = it.next();
JSONArray a = obj.optJSONArray(key);
if (a != null)
parseJsonArray(a, i,layer);
else {
JSONObject jsonObject = getJSONObject(obj.optString(key));
String jsonKey = i + "/" + lastLayer + "/" + key;
parseJson(jsonObject, jsonKey);
}
}
}
return layer;
}
public HashMap<String,String> getJSONMap(){
return jsonMap;
}
}
写起来练练手,跟Google的GSON框架没法比,自我感觉效率不是很高(在循环里面递归,然后又用String,而没有StringBuilder,有时间再优化下)。改天可以学学他的代码 看看是怎么处理的。