您的位置:首页 > Web前端 > JavaScript

自定义——无穷递归解析json工具

2013-03-15 10:59 246 查看
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,有时间再优化下)。改天可以学学他的代码 看看是怎么处理的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: