JSON串转换成Map以及如何转换到对应的数据类型

        在实际开发中,难免会碰到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

扫描二维码关注公众号,回复: 815787 查看本文章

三.知识扩展

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) 取值不存在返回默认值。

猜你喜欢

转载自bijian1013.iteye.com/blog/2219050