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; }
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的过程 主要用到的思想就是递归和引用传递。