文档章节

采用json-lib进行Map与Json转换

learn_more
 learn_more
发布于 2015/03/13 17:56
字数 1071
阅读 5174
收藏 17

    Json转换工具实在之多,最近又听说FastJson对Java序列化和反序列化最优,相比 Java自带序列化、Json-lib、Jackson等。不过本人很青睐Gson,但是好像用的人也不是很多,项目中用的最多的就是垃圾Json-lib了,虽然烂,但是还是的继续使用着,因为项目在我来之前已经搭建了,不过现在我推荐使用Jackson,官网说到这是Json工具中最快的一个,当然是有一点吹牛的,因为他没有拿数据说话!之所以推荐Jackson,Jackson确实速度快,而且Spring内部原生支持Jackson对Json的转换,也就是只要我们在XML中配置然后添加Jackson包,就大功告成了!具体如何操作可以参见博客:

Spring MVC Rest 学习一 http://my.oschina.net/heweipo/blog/337581

    对于其他的Json包,诸如simpleJson等,这些东西本人没有什么了解,不过可以参考如下地址,看看maven仓库中的介绍:

Maven Repository http://mvnrepository.com/search?q=Json

    好了,不多说了,下面开始把本人归纳总结的Map、List 与 Json之间转换的代码贴上,确实很简单。

1、判断是否满足Json格式

    /**
	     * 该字符串可能转为 JSONObject 或 JSONArray
	     * @param string
	     * @return
	     */
	    public static boolean mayBeJSON(String string) {
			return ((string != null) && ((("null".equals(string))
					|| ((string.startsWith("[")) && (string.endsWith("]"))) || ((string
					.startsWith("{")) && (string.endsWith("}"))))));
		}
	    
	    /**
	     * 该字符串可能转为JSONObject
	     * @param string
	     * @return
	     */
	    public static boolean mayBeJSONObject(String string) {
			return ((string != null) && ((("null".equals(string))
					 || ((string.startsWith("{")) && (string.endsWith("}"))))));
		}
	    
	    /**
	     * 该字符串可能转为 JSONArray
	     * @param string
	     * @return
	     */
	    public static boolean mayBeJSONArray(String string) {
			return ((string != null) && ((("null".equals(string))
					|| ((string.startsWith("[")) && (string.endsWith("]"))))));
		}

2、Json 与 Map 的转换

 /**
	  *函数注释:parseJSON2Map()<br>
	  *时间:2014-10-28-上午10:50:21<br>
	  *用途:该方法用于json数据转换为<Map<String, Object>
	  *@param jsonStr
	  *@return
	  */
	    public static Map<String, Object> parseJSON2Map(String jsonStr){  
	        Map<String, Object> map = new HashMap<String, Object>();  
	        //最外层解析  
	        JSONObject json = JSONObject.fromObject(jsonStr);  
	        for(Object k : json.keySet()){  
	            Object v = json.get(k);   
	            //如果内层还是数组的话,继续解析  
	            if(v instanceof JSONArray){  
	                List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();  
	                Iterator<JSONObject> it = ((JSONArray)v).iterator();  
	                while(it.hasNext()){  
	                    JSONObject json2 = it.next();  
	                    list.add(parseJSON2Map(json2.toString()));  
	                }  
	                map.put(k.toString(), list);  
	            } else {  
	                map.put(k.toString(), v);  
	            }  
	        }  
	        return map;  
	    }  
	    
	    /**
              * 函数注释:parseJSON2MapString()<br>
	      * 用途:该方法用于json数据转换为<Map<String, String><br>
	      * 备注:***<br> 
	      */
	    public static Map<String, String> parseJSON2MapString(String jsonStr){  
	        Map<String, String> map = new HashMap<String, String>();  
	        //最外层解析  
	        JSONObject json = JSONObject.fromObject(jsonStr);  
	        for(Object k : json.keySet()){ 
	            Object v = json.get(k);   
	            if(null!=v){
	            	map.put(k.toString(), v.toString());  
	            }
	        }  
	        return map;  
	    }

3、Json 与 List  的转换

/**
	 *函数注释:parseJSON2List()<br>
	 *用途:该方法用于json数据转换为List<Map<String, Object>><br>
	 */
	 public static List<Map<String, Object>> parseJSON2List(String jsonStr){  
	        JSONArray jsonArr = JSONArray.fromObject(jsonStr);  
	        List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();  
	        Iterator<JSONObject> it = jsonArr.iterator();  
	        while(it.hasNext()){  
	            JSONObject json2 = it.next();  
	            list.add(parseJSON2Map(json2.toString()));  
	        }  
	        return list;  
	    }
	 
	/**
	* 函数注释:parseJSON2ListString()<br>
	* 用途:该方法用于json数据转换为List<Map<String, String>><br>
	*/
	 public static List<Map<String, String>> parseJSON2ListString(String jsonStr){  
		        JSONArray jsonArr = JSONArray.fromObject(jsonStr);  
		        List<Map<String, String>> list = new ArrayList<Map<String,String>>();  
		        Iterator<JSONObject> it = jsonArr.iterator();  
		        while(it.hasNext()){  
		            JSONObject json2 = it.next();  
		            list.add(parseJSON2MapString(json2.toString()));  
		        }  
		        return list;  
		    }

4、List 或者 Map 与 Json的转换

JSONObject.fromObject(obj).toString();
JSONArray.fromObject(obj).toString();

5、为什么不使用 JSONObject.toBean

    我的理由是:这个方法我相信用过的人都是恨之入骨,至少我是这样的,以前写过一个javaBean,结果硬是要javaBean中的属性和Json的属性完全相同,二者转换才不会报错。

6、提醒

    Json格式是要求value必须有双引号,否则就不是标准的 Json, 那么,在上面提供的方法中,假设有个 Map<String,Object> 然而这个Object有可能是一个List<Map<String,Object>>,那么想要获取里面的List对象时,可千万不要调用parseJSON2Map,原因是他得到的值会把value中的双引号全部去掉,那么这个结果是不符合Json规范的,后面在解析List就会出错。

net.sf.json.JSONException: Unquotted string

正确的做法应该是 采用 JSONObject先解析成功JSONObject,然后再用JSONObject对象获取List的Json字符串,然后调用上面的parseJSON2ListString,这样就成功了!

7、提供一些Json帮助网站以及工具

1)Json在线校验:http://www.bejson.com/

2)Json在线解析:火狐浏览器插件 json-handler 非常不错

3)Json-lib 所需要的jar : http://download.csdn.net/detail/wp562846864/7238979




© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
Java构造和解析Json数据的两种方法详解二

在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别。下面接着介绍用org.json构造和解析Json数据的方法示例。 用jso...

小代码2016
2016/03/28
70
0
jqGrid的多字段查询

多字段查询,相对于单字段的过滤而言,可以称得上是高级查询了。见下图。 多字段查询的jqGrid调用方式如下: 大家可以看到最后一句话:.searchGrid({multipleSearch:true}),对,就是这么简单...

yonge
2009/12/10
9.7K
6
Json那点事儿

1.JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,JSON以key-value的形式提供了很好的读写,在web开发中之前用过xml来进行数据的交互和传输, 但xml的数据结构比较复...

陈小扁
2016/04/10
108
1
Google Gson的使用方法及JSON 技术对比

一 、各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包, 包括commons-beanutils.jar,commons-collectio...

hapier
2016/11/14
130
0
json处理,json、object的相互转化

用 FastJson将Json转换Bean ,用Jackson或Gson将Bean 转FastJson 要求能够支持获取Object中的Object,即支持深层嵌套的Object解析,此外json、Object间的相互转换要快速。 参考:各个JSON技术...

刘阳0292
2017/07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro ScrollView 组件的 scrollTop 属性是个坑

官方issue:ScrollView设置scrollTop没效果 同样的,设置 scrollTop=0 并不能实现置顶,官方回复早就修复了,我的 Taro 版本已经是最新的,然而并未修复。 万能的评论区,给出了失效的原因。...

dkvirus
13分钟前
0
0
Qt那些事0.0.21

这次还是关于PRO文件中QMAKE_POST_LINK的故事。 平时都是使用VS2015作为编译器,恰巧想用MinGW编一版程序,结果偏偏出现了错误。话说测试的这个项目可是在Linux下(fodera 20)可以正确编译通...

Ev4n
23分钟前
0
0
OSChina 周六乱弹 —— 抖音外放 亲妈下葬。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :一直没想明白黎明是怎么混进「四大天王」的,直到最近网易云音乐心动模式开启之后 #今日歌曲推荐# 《那有一天不想你》- 黎明 手机...

小小编辑
54分钟前
274
8
Linux使用源码包安装软件

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 源码包 Linux软件多数免费、开源,是开发人员编写的,具有很强可读性的一组相关代码文本。 源码包 --> 编...

迷失De挣扎
今天
6
0
IPv4如何转换为IPv6?

ipv6已经逐渐在应用,现在已经有很多的运营商支持ipv6,前天我们也发布了如何让电脑使用ipv6地址?有很多朋友在问?ipv6有什么作用,它的表示方式是什么,今天我们来一起来详细了解下ipv6相关计...

xiangyunyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部