在实际开发中,难免会碰到JSON串转换成Map的情况,下面来看看这方面的实例。另外,由于fastjson只支持JDK1.5及以上版本,因此在JDK1.4的项目中可以采用net.sf.json来处理。
一.fastjson实例
JsonUtil.java
package com.study; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; public class JsonUtil { private static List<Map<String, Object>> json2List(Object json) { JSONArray jsonArr = (JSONArray) json; List<Map<String, Object>> arrList = new ArrayList<Map<String, Object>>(); for (int i = 0; i < jsonArr.size(); ++i) { arrList.add(strJson2Map(jsonArr.getString(i))); } return arrList; } public static Map<String, Object> strJson2Map(String json) { JSONObject jsonObject = JSONObject.parseObject(json); Map<String, Object> resMap = new HashMap<String, Object>(); Iterator<Entry<String, Object>> it = jsonObject.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Object> param = (Map.Entry<String, Object>) it.next(); if (param.getValue() instanceof JSONObject) { resMap.put(param.getKey(), strJson2Map(param.getValue().toString())); } else if (param.getValue() instanceof JSONArray) { resMap.put(param.getKey(), json2List(param.getValue())); } else { resMap.put(param.getKey(), JSONObject.toJSONString(param.getValue(), SerializerFeature.WriteClassName)); } } return resMap; } }
JsonToMap.java
package com.study; import java.util.List; import java.util.Map; public class JsonToMap { private static String jsonStr = "{\"list\":[{\"aNum\":3,\"bNum\":1}],\"resCode\":\"0\",\"resMessage\":\"成功\"}"; public static void main(String[] args) { try { Map<String, Object> resMap = JsonUtil.strJson2Map(jsonStr); List<Map<String, Object>> resList = (List<Map<String, Object>>) resMap.get("list"); for (int i = 0; i < resList.size(); i++) { Map<String, Object> res = (Map<String, Object>) resList.get(i); String aNum = (String) res.get("aNum"); double totalActualDouble = Double.parseDouble(aNum); System.out.println(totalActualDouble); } System.out.println(resMap); } catch (Exception e) { System.out.println("Exception:" + e.getMessage()); } } }
依赖JAR包:fastjson-1.1.26.jar
二.net.sf.json实例
JsonUtil.java
package com.study; import java.text.ParseException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class JsonUtil { public final static Map strJson2Map(String jsonStr) throws ParseException { JSONObject jsonObject = new JSONObject(jsonStr); return json2Map(jsonObject); } public final static Map json2Map(JSONObject jsonObject) { Map resultMap = new HashMap(); Iterator iterator = jsonObject.keys(); while (iterator.hasNext()) { String key = (String) iterator.next(); Object value = jsonObject.get(key); if (value instanceof JSONObject) { value = json2Map((JSONObject) value); resultMap.put(key, value); } else if (value instanceof JSONArray) { value = json2List((JSONArray) value); resultMap.put(key, value); } else { resultMap.put(key, jsonObject.getString(key)); } } return resultMap; } public final static List json2List(JSONArray jsonArray) { List resultList = new ArrayList(); for (int i = 0; i < jsonArray.length(); i++) { Object value = jsonArray.get(i); if (value instanceof JSONObject) { value = json2Map((JSONObject) value); } else if (value instanceof JSONArray) { value = json2List((JSONArray) value); } resultList.add(value); } return resultList; } }
JsonToMap.java
package com.study; import java.util.List; import java.util.Map; public class JsonToMap { private static String jsonStr = "{\"list\":[{\"aNum\":3,\"bNum\":1}],\"resCode\":\"0\",\"resMessage\":\"成功\"}"; public static void main(String[] args) { try { Map resMap = JsonUtil.strJson2Map(jsonStr); List resList = (List) resMap.get("list"); for (int i = 0; i < resList.size(); i++) { Map res = (Map) resList.get(i); String aNum = (String) res.get("aNum"); double totalActualDouble = Double.parseDouble(aNum); System.out.println(totalActualDouble); } System.out.println(resMap); } catch (Exception e) { System.out.println("Exception:" + e.getMessage()); } } }
依赖JAR包:json-lib-0.7.1.jar、commons-logging-1.0.4.jar
三.知识扩展
1.fastjson如何将json数据串转换为Object[]时指定各个数据项的数据类型
Object[] o=new Object[]{"1",2,(short)3,4l,5.0d,6.0f,0.3d,0.3f};
此时数组o中各数据项的类型是,如下:
{String.class,Integer.class,Short.class,Double.class,Float.class,Double.class,Float.class}
经过如下三个步骤:
JSON json=(JSON)JSONObject.toJSON(o); String js=json.toString(); JSON json1=(JSON)JSONObject.parse(js);
此时,json1中的数据相对类型是,如下:
{String.class,Integer.class,Integer.class,Integer.class,Integer.class,BigDecimal.class,BigDecimal.class}
如何才能转会原来的数据类型呢?
方案一(推荐使用,如上实例就是采用这种方式):
转换成json串的时候带入类型信息:
String j=JSONObject.toJSONString(o,SerializerFeature.WriteClassName);
转换结果是这样的["1",2,3S,4L,5D,6F,0.3D,0.3D,0.3F],这样,parse的时候就可以转换成相应的类型。
方案二:
转换的时候加入类型信息:
Class[] c={String.class,Integer.class,Short.class,Long.class,Double.class,Float.class,Double.class,Float.class}; List<Object> json1=(List<Object>)JSONObject.parseArray(js, c);
2.net.sf.json如何将json数据串转换为Object[]时指定各个数据项的数据类型
对于统一操作,建议采用上面fastjson推荐的方法思路,先将其转换成String类型,再parse解析成需要的类型,如net.sf.json实例所示。但如果JSON串内容较少,也可以采用如下获取指定类型数据的方法:
JSONObject json = JSONObject.fromObject(jsonString) System.out.println(json.getString("Rel_ProName")); System.out.println(json.getDouble("Rel_taxSumprice"));
PS:当从一个 jsonObject 中去值时,遇到两个方法,optDouble和getDouble。getDouble("key") 取值不存在或者类型不对报错,而optDouble("key",0) 取值不存在返回默认值。