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

编程技术  /  houtizong 发布于 3年前   70

        在实际开发中,难免会碰到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) 取值不存在返回默认值。

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客