原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mengzhengbin520.blog.51cto.com/7590564/1283361
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
欲实现JSON字符串和java对象之间的互相转换,方法有很多!本人层也因为项目上的需求,一度对这几种方法做过研究和试验!现将自己的一点小经验分享与大家,如有纰漏,请指正!
1.通过json_lib来实现对json和java对象之间的转换,使用JSON-LIB可以极大的简化JAVA对象转换成JSON对象所需进行的操作,更可以避免人工操作生成JSON对象字符串时带来的麻烦和误操作:
注:欲使用json_lib需要以下几个jar包的支持:
json-lib-1.1-jdk15.jar 下载地址:http://json-lib.sourceforge.net
commons-collections-3.2.1.jar
commons-lang-2.4.jar
commons-logging-1.1.1.jar
commons-beanutils-1.8.0.jar
以上commons系列包在tomcat/comon/lib下可以找到;
ezmorph-1.0.6.jar 下载地址http://ezmorph.sourceforge.net
morph-1.0.1 下载地址:http://morph.sourceforge.net
有了这些jar包的支持,平时关于json处理的方法都可以找到对应的类;贴上一段代码示例:
package util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class JSONHelper {
/**
* 将JSONArray对象转换成Map-List集合
* @param jsonArr
* @return
*/
public static Object JsonToList(JSONArray jsonArr){
List<Object> jsonObjList = new ArrayList<Object> ();
for(Object obj : jsonArr){
if(obj instanceof JSONArray){
jsonObjList.add(JsonToList((JSONArray) obj));
} else if(obj instanceof JSONObject){
jsonObjList.add(JsonToMap((JSONObject) obj));
}else{
jsonObjList.add(obj);
}
}
return jsonObjList;
}
/**
* 将JSONObjec对象转换成Map-List集合
* @param json
* @return
*/
public static Map<String, Object> JsonToMap(JSONObject json){
Map<String,Object> columnValMap = new HashMap<String,Object>();
Set<Object> jsonKeys = json.keySet();
for (Object key : jsonKeys) {
Object JsonValObj = json.get(key);
if(JsonValObj instanceof JSONArray){
columnValMap.put((String)key, JsonToList((JSONArray) JsonValObj));
}else if(key instanceof JSONObject){
columnValMap.put((String)key, JsonToMap((JSONObject) JsonValObj));
}else{
columnValMap.put((String)key,JsonValObj);
}
}
return columnValMap;
}
/**
* 将json对象转换为map集合,通过此方法获取存放map集合键的list集合
* @param obj
* @return
*/
public static List<Object> mapKeys(Object obj){
List<Object> keysList = new ArrayList<Object>();
Map<String,Object> columnValMap = new HashMap<String,Object>();
String columnStr = "column";
if(obj instanceof JSONArray){
List<Map<String, Object>> jsonObjList = new ArrayList<Map<String, Object>> ();
jsonObjList = (List<Map<String, Object>>) JsonToList((JSONArray) obj);
columnValMap =(Map<String, Object>) (jsonObjList.get(0));
//以上三句可优化为如下一句
//columnValMap =(Map<String, Object>)(((List<Object>)JsonToList((JSONArray) obj)).get(0));
}else if(obj instanceof JSONObject){
columnValMap =JsonToMap((JSONObject) obj);
}else{
keysList.add(obj);
}
for(int i=0;i<columnValMap.keySet().size();i++){
keysList.add(columnStr+(i+1));
}
System.out.println(keysList.size());
return keysList;
}
}
2.通过使用谷歌的Gson来处理json字符串,谷歌的Gson针对封装的javaBean处理起来很方便,但对于未封装的json字符串需要找到技巧处理起来也才能顺手。
使用谷歌的Gson当然也需要jar包的支持,这需要一个jar包:Gson.jar
下载地址:http://code.google.com/p/google-gson/downloads/detail?name=google-gson-2.2.4-release.zip
示例:将通过js获取的json字符串转换为Map、List集合,代码如下:
package util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
public class JSONHelper {
private Gson gson = new Gson();
/**
* 将json对象转换为map集合,通过此方法获取存放map集合键的list集合
* @param obj
* @return
*/
public static List<Object> mapKeys(Map<?,?> map){
List<Object> keysList = new ArrayList<Object>();
String columnStr="column";
for(int i=0;i<map.keySet().size();i++){
keysList.add(columnStr+(i+1));
}
System.out.println(keysList.size());
return keysList;
}
/**
* 将传入的json字符串转换为元素为map集合的List集合
* @param jsonArrStr
* @return
*/
public static List<Map<String, Object>> jsonObjList(String jsonArrStr) {
List<Map<String, Object>> jsonObjList = new ArrayList<Map<String, Object>>();
List<?> jsonList = Test.jsonToList(jsonArrStr);
Gson gson = new Gson();
for (Object object : jsonList) {
String jsonStr = gson.toJson(object);
Map<?, ?> json = Test.jsonToMap(jsonStr);
jsonObjList.add((Map<String, Object>) json);
}
return jsonObjList;
}
/**
* 将传入的json字符串解析为List集合
* @param jsonStr
* @return
*/
public static List<?> jsonToList(String jsonStr) {
List<?> ObjectList = null;
Gson gson = new Gson();
java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<?>>() {}.getType();
ObjectList = gson.fromJson(jsonStr, type);
return ObjectList;
}
/**
* 将传入的json字符串解析为Map集合
* @param jsonStr
* @return
*/
public static Map<?, ?> jsonToMap(String jsonStr) {
Map<?, ?> ObjectMap = null;
Gson gson = new Gson();
java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<?,?>>() {}.getType();
ObjectMap = gson.fromJson(jsonStr, type);
return ObjectMap;
}
}
3.使用最轻量级的org.json.jar实现json字符串和java对象之间的互转
所需jar包:org.json.jar
下载地址:www.json.org 或第三方:http://kiccp.sinaapp.com/store/info/111
同样实现对json字符串转换为Map、List集合,代码如下:
package util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* 此类是处理json字符串的工具类
*
* @author xiaomeng
* @since 2013-08-27
*
*/
public class JSONHelper {
/**
* 将json字符串转换为List集合
*
* @param jsonArrStr
* @return
*/
public static List<Map<String, Object>> jsonObjList(String jsonArrStr) {
List<Map<String, Object>> jsonList = new ArrayList<Map<String, Object>>();
JSONArray jsonArr = null;
try {
jsonArr = new JSONArray(jsonArrStr);
jsonList = (List<Map<String, Object>>)JSONHelper.jsonToList(jsonArr);
} catch (JSONException e) {
System.out.println("Json字符串转换异常!");
e.printStackTrace();
}
return jsonList;
}
/**
* 将json对象的键值存放在集合,映射table的column
*
* @param map
* @return
*/
public static List<String> jsonMapKeysList(Map<?, ?> map) {
List<String> jsonjsonList = new ArrayList<String>();
String columnStr = "column";
for (int i = 0; i < map.keySet().size(); i++) {
jsonjsonList.add(columnStr + (i + 1));
}
System.out.println(jsonjsonList.size());
return jsonjsonList;
}
/**
* 将传递近来的json数组转换为List集合
*
* @param jsonArr
* @return
* @throws JSONException
*/
private static List<?> jsonToList(JSONArray jsonArr)
throws JSONException {
List<Object> jsonToMapList = new ArrayList<Object>();
for (int i = 0; i < jsonArr.length(); i++) {
Object object = jsonArr.get(i);
if (object instanceof JSONArray) {
jsonToMapList.add(JSONHelper.jsonToList((JSONArray) object));
} else if (object instanceof JSONObject) {
jsonToMapList.add(JSONHelper.jsonToMap((JSONObject) object));
} else {
jsonToMapList.add(object);
}
}
return jsonToMapList;
}
/**
* 将传递近来的json对象转换为Map集合
*
* @param jsonObj
* @return
* @throws JSONException
*/
@SuppressWarnings("unchecked")
private static Map<String, Object> jsonToMap(JSONObject jsonObj)
throws JSONException {
Map<String, Object> jsonMap = new HashMap<String, Object>();
Iterator<String> jsonKeys = jsonObj.keys();
while (jsonKeys.hasNext()) {
String jsonKey = jsonKeys.next();
Object jsonValObj = jsonObj.get(jsonKey);
if (jsonValObj instanceof JSONArray) {
jsonMap.put(jsonKey, JSONHelper.jsonToList((JSONArray) jsonValObj));
} else if (jsonValObj instanceof JSONObject) {
jsonMap.put(jsonKey, JSONHelper.jsonToMap((JSONObject) jsonValObj));
} else {
jsonMap.put(jsonKey, jsonValObj);
}
}
return jsonMap;
}
}
以上三种常用的json和java对象之间的互相转换方法各有其特点,根据我的小经验,现将其优缺点总如下,供参考!
1.json_lib json解析框架
优点:各种复杂json格式和对json处理的一般需求都可以做到
缺点:所需支持的jar文件较多,并且关于jar包版本或许会出现一些杂七杂八的问题
2.谷歌Gson对json的解析:
优点:(1)。可以谷歌的Gson就是为处理java对象和json之间转换开发的框架,其可以很简单、方便的对封装的java对象和json格式文本之间的转换,包括java工具类集合之间的转换也很方便;(2)。相对json_lib框架来说,只需要一个Gson.jar就可以,需要jar文件数量少;
缺点:由于其相对来说偏向于处理java对象和json之间的转换,所以其只简单的处理json字符串和集合类之间的转换稍微需要一个过渡,就是使用反射确定转换的java对象类型。
3.org.json框架
优点:在这三者之中,其实最轻量级、同谷歌Gson一样所需jar文件也是最少的一种方法,并且其在处理json字符串到java集合的转黄相对简便
缺点:相对Gson处理java对象和json之间的转换比较费事
综述:这三种解析json的方法各有优缺点,具体可根据自己需求选择使用。
本文出自 “有梦就有希望” 博客,请务必保留此出处http://mengzhengbin520.blog.51cto.com/7590564/1283361
附件下载:
json-lib-2.4-jdk15框架jar包及其附属jar包
google-gson最新版本jar包
org.json.jar包
Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】的更多相关文章
-
做一次面向对象的体操:将JSON字符串转换为嵌套对象的一种方法
背景与问题 在 <一个略复杂的数据映射聚合例子及代码重构> 一文中,将一个JSON字符串转成了所需要的订单信息Map.尽管做了代码重构和配置化,过程式的代码仍然显得晦涩难懂,并且客户端使用 ...
-
JSON字符串与java对象的转换
所需的jar包: 1.commons-lang.jar 2.commons-beanutils.jar 3.commons-collections.jar 4.commons-logging.jar ...
-
JSON 字符串 与 java 对象的转换
jsonLib 经典文章:http://json-lib.sourceforge.net/xref-test/net/sf/json/TestJSONObject.html // 引入相应的包 //j ...
-
Json对象与Json字符串的转化、JSON字符串与Java对象的转换
一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...
-
Json对象与Json字符串的转化、JSON字符串与Java对象的转换(转)
一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...
-
json字符串与java对象的相互转换(jackson)
1.java对象转换为json字符串 package com.chichung.json; import com.fasterxml.jackson.core.JsonProcessingExcept ...
-
Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
总结一下利用Json相关jar包实现Java对象和集合与Json字符串之间的互相转换: 1.创建的User类: package com.ghj.packageofdomain; public clas ...
-
JSon_零基础_007_将JSon格式的";数组";字符串转换为Java对象";数组";
将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...
-
JSon_零基础_006_将JSon格式的字符串转换为Java对象
需求: 将JSon格式的字符串转换为Java对象. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key ...
随机推荐
-
JSON格式序列化与反序列化(List、XML)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
-
使用kvm虚拟出Centos6.5系统相关步骤
使用kvm虚拟出Centos6.5系统相关步骤 kvm是啥东西,亲们自行百度哇,一两句话也说不清楚,直接进主题使用宿主机虚拟出一台centos6.5的系统,当然其他系统也可以的,考虑到企业常用服务器系 ...
-
POJ 3067 Japan(树状数组)
Japan Time Limit: 10 ...
-
XE6 FMX之控件绘制与显示
中午,有个货随手买的2块钱的彩票,尼玛中了540块,这是啥子*气运.稍微吐槽一下,现在开始正规的笔记录入.经常有朋友说为毛我的博客不更新了或者说更新的少了,为啥呢!一来自己懒了,没学习什么新的东西, ...
-
hdu 5762 Teacher Bo 曼哈顿路径
Teacher Bo Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
-
sublime 设置localhost 2
最近sidebar用不了了,提示更新然后就自动卸载了: 研究了下其他方式实现: Sublime Text 2 Sublime Text 3 都可以使用: 菜单 --> Tools --> ...
-
[ffmpeg 扩展第三方库编译系列] frei0r mingw32 下编译问题
在编译安装frei0r的时候遇到两个错误地方, 两个都是在install的时候. 一开始编译都很顺利,输入了 make install之后就走开了,回来一看,报错误. 提示mkdir -p //usr ...
-
Eclipse SVN插件安装与使用(2014.12.27——by小赞)
安装参考:http://www.cnblogs.com/xdp-gacl/p/3497016.html 用法参考:http://blog.sina.com.cn/s/blog_8a3d83320100 ...
-
[置顶] EasyMock构建单元测试
1. 背景 单元测试作为程序的基本保障.很多时候构建测试场景是一件令人头疼的事.因为之前的单元测试都是内部代码引用的,环境自给自足.开发到了一定程度,你不得不到开始调用外部的接口来完成你的功能.而外部 ...
-
HDU 4738 Caocao&#39;s Bridges(割边)
乍一看一个模板题,仔细一看还是模板题,但是三个坑.1,不是连通图,放0个.2 守卫为0,放1个. 3注意重边. #include<iostream> #include<cstdio& ...