深入了解Json转变为map的思想,附源代码

public static Map json2Map(String json) {
		LinkedMap map = new LinkedMap();
		JSONObject js = JSONObject.fromObject(json);
		populate(js, map);
		return map;
	}

接到一个json字符串,其内容可以是String str="{aaa:test,key:[\"A\",\"B\",\"C\"],val:[\"1111\",\"2222\",\"333\"]}"

注意这里的value,必须是带引号的,而key是可以不带,大家可以自己下一个jsonview来检查自己的json格式是否正确。

如果json格式不正确的话 

		JSONObject js = JSONObject.fromObject(json);

会报错。

populate(js,map);功能主要是把json中的键值对解析成map,

其代码如下:

private static Map populate(JSONObject jsonObject, Map map) {
		for (Iterator iterator = jsonObject.entrySet().iterator(); iterator
				.hasNext();) {
			String entryStr = String.valueOf(iterator.next());
			String key = entryStr.substring(0, entryStr.indexOf("="));
			String value = entryStr.substring(entryStr.indexOf("=") + 1,
					entryStr.length());
			if (jsonObject.get(key).getClass().equals(JSONObject.class)) {
				HashMap _map = new HashMap();
				map.put(key, _map);
				populate(jsonObject.getJSONObject(key), ((Map) (_map)));
			} else if (jsonObject.get(key).getClass().equals(JSONArray.class)) {
				ArrayList list = new ArrayList();
				map.put(key, list);
				populateArray(jsonObject.getJSONArray(key), list);
			} else {
				map.put(key, jsonObject.get(key));
			}
		}

		return map;
	}

从上面代码可以看出,首先得到key,判断key的type 有三种情况:

1 如aaa:"test",则看出jsonObject.get(key).getClass()即"test"的type为String,直接放到返回的map里

2 如里仍然是键值对,则递归调用populate,返回一个map到上一级的map里

3 如果是键对应数组,则调用populateArray这个方法,代码如下:

 private static void populateArray(JSONArray jsonArray, List list) {
		    for (int i = 0; i < jsonArray.size(); i++)
		      if (jsonArray.get(i).getClass().equals(JSONArray.class)) {
		        ArrayList _list = new ArrayList();
		        list.add(_list);
		        populateArray(jsonArray.getJSONArray(i), _list);
		      } else if (jsonArray.get(i).getClass().equals(JSONObject.class)) {
		        HashMap _map = new HashMap();
		        list.add(_map);
		        populate(jsonArray.getJSONObject(i), _map);
		      } else {
		        list.add(jsonArray.get(i));
		      }
		  }
返回一个list到上级的map里,其中还是用同样的算法进行判断。


这个json转map的过程 主要用到的思想就是递归和引用传递。

你可能感兴趣的:(深入了解Json转变为map的思想,附源代码)