- 浏览: 1071462 次
- 性别:
- 来自: 南京
-
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
因为gson网上的帮助文档打开时比较慢,所以把帮助文档摘录如此,方便查看:
1. 基本类型转化
2.对象转化
Note that you can not serialize objects with circular references since that will result in infinite recursion.
如果要是用json lib的话,上面的代码可以写成如下所示:
Finer Points with Objects
It is perfectly fine (and recommended) to use private fields
There is no need to use any annotations to indicate a field is to be included for serialization and deserialization. All fields in the current class (and from all super classes) are included by default.
If a field is marked transient, (by default) it is ignored and not included in the JSON serialization or deserialization.
This implementation handles nulls correctly
While serialization, a null field is skipped from the output
While deserialization, a missing entry in JSON results in setting the corresponding field in the object to null
If a field is synthetic , it is ignored and not included in JSON serialization or deserialization
Fields corresponding to the outer classes in inner classes, anonymous classes, and local classes are ignored and not included in serialization or deserialization
Nested Classes (including Inner Classes)
Gson can serialize static nested classes quite easily.
Gson can also deserialize static nested classes. However, Gson can not automatically deserialize the pure inner classes since their no-args constructor also need a reference to the containing Object which is not available at the time of deserialization. You can address this problem by either making the inner class static or by providing a custom InstanceCreator for it. Here is an example:
NOTE : The above class B can not (by default) be serialized with Gson.
G s o n c a n n o t d e serialize {"b":"abc"} into an instance of B since the class B is an inner class. if it was defined as static class B then Gson would have been able to deserialize the string. Another solution is to write a custom instance creator for B.
The above is possible, but not recommended.
数组例子:
We also support multi-dimensional arrays, with arbitrarily complex element types
综合实例1:
测试:
输出如下:[{"name":"xxlong0","id":"0","age":20,"isOk":false},{"name":"xxlong1","id":"1","age":21,"isOk":false},{"name":"xxlong2","id":"2","age":22,"isOk":false},{"name":"xxlong3","id":"3","age":23,"isOk":false},{"name":"xxlong4","id":"4","age":24,"isOk":false}]
综合实例2:
需求:想将字符串{'tableName' :'ys_index_y','year': '2008','params':'[z_expense,z_expense_profit,z_main_margin]','isOperAll':'false','copyToYear':''}还原成对象OpeerConditions,OpeerConditions对象代码如下所示
因为OperConditions中有属性params,它是一个数组,所以无论是用json lib还是gson都不能直接将上面的字符串还原成OperCondtions对象,可以直接将params分离出来,单独处理,我这里选用此种方法来处理:
json-lib代码如下:
因为JSONArray的toArray()方法返回的是一个Object[]数组,所以先将它转化成list,再转化到String数组。
当然由JSONArray转化成list时也可以使用subList方法,如下所示:
或者可以直接使用JSONArray的iterator() 方法迭代它本身直接得到需要的String数组。
如果使用Gson来完成这一需求,个人感觉更简单,代码如下所示:
Gson可以直接转化成String[]数组,同时转化OperConditions时也比json-lib简单。
还有一点是非常值得注意的,就是你的bean中有boolean属性值时,强烈建议你别像我这个例子中一样命名为以is开头的属性名,这可能给你带来意想不到的错误,关于这一点的详细解说请参看我的文章json lib 学习笔记
【转载地址】
http://ryxxlong.iteye.com/blog/736783
1. 基本类型转化
public static void main(String[] args) { Gson gson = new Gson(); System.out.println(gson.toJson(1)); // ==> prints 1 System.out.println(gson.toJson("abcd"));// ==> prints "abcd" System.out.println(gson.toJson(new Long(10)));// ==> prints 10 int[] values = { 1 }; System.out.println(gson.toJson(values));// ==> prints [1] System.out.println("============"); int one = gson.fromJson("1", int.class); Integer one1 = gson.fromJson("1", Integer.class); Long one2 = gson.fromJson("1", Long.class); String str = gson.fromJson("\"abc\"", String.class); String anotherStr = gson.fromJson("[\"abc\"]", String.class); int[] ints = gson.fromJson("[1,2,3,4,5]", int[].class); Boolean b = gson.fromJson("false", Boolean.class); System.out.println(b == false); //==> prints true }
2.对象转化
public class BagOfPrimitives { private int value1 = 1; private String value2 = "abc"; //是用于声明变量在序列化的时候不被存储 private transient int value3 = 3; BagOfPrimitives() { // no-args constructor } public static void main(String[] args) { BagOfPrimitives obj = new BagOfPrimitives(); Gson gson = new Gson(); String json = gson.toJson(obj); System.out.println(json); //==> json is {"value1":1,"value2":"abc"} BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class); System.out.println(obj2.value1); System.out.println(obj2.value2); System.out.println(obj2.value3);//==>3 String json1 = "{'value1':1,'value2':'abc','value3':4}"; BagOfPrimitives obj3 = gson.fromJson(json1, BagOfPrimitives.class); System.out.println(obj3.value1); System.out.println(obj3.value2); System.out.println(obj3.value3); //==>3 } }
Note that you can not serialize objects with circular references since that will result in infinite recursion.
如果要是用json lib的话,上面的代码可以写成如下所示:
String json1 = "{'value1':1,'value2':'abc','value3':4}"; JSONObject jsonObj = JSONObject.fromObject( json1 ); BagOfPrimitives obj3 = (BagOfPrimitives) JSONObject.toBean( jsonObj, BagOfPrimitives.class );
Finer Points with Objects
It is perfectly fine (and recommended) to use private fields
There is no need to use any annotations to indicate a field is to be included for serialization and deserialization. All fields in the current class (and from all super classes) are included by default.
If a field is marked transient, (by default) it is ignored and not included in the JSON serialization or deserialization.
This implementation handles nulls correctly
While serialization, a null field is skipped from the output
While deserialization, a missing entry in JSON results in setting the corresponding field in the object to null
If a field is synthetic , it is ignored and not included in JSON serialization or deserialization
Fields corresponding to the outer classes in inner classes, anonymous classes, and local classes are ignored and not included in serialization or deserialization
Nested Classes (including Inner Classes)
Gson can serialize static nested classes quite easily.
Gson can also deserialize static nested classes. However, Gson can not automatically deserialize the pure inner classes since their no-args constructor also need a reference to the containing Object which is not available at the time of deserialization. You can address this problem by either making the inner class static or by providing a custom InstanceCreator for it. Here is an example:
public class A { public String a; class B { public String b; public B() { // No args constructor for B } } }
NOTE : The above class B can not (by default) be serialized with Gson.
G s o n c a n n o t d e serialize {"b":"abc"} into an instance of B since the class B is an inner class. if it was defined as static class B then Gson would have been able to deserialize the string. Another solution is to write a custom instance creator for B.
public class InstanceCreatorForB implements InstanceCreator<A.B> { private final A a; public InstanceCreatorForB(A a) { this.a = a; } public A.B createInstance(Type type) { return a.new B(); } }
The above is possible, but not recommended.
数组例子:
Gson gson = new Gson(); int[] ints = {1, 2, 3, 4, 5}; String[] strings = {"abc", "def", "ghi"}; (Serialization) gson.toJson(ints); ==> prints [1,2,3,4,5] gson.toJson(strings); ==> prints ["abc", "def", "ghi"] (Deserialization) int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); ==> ints2 will be same as ints
We also support multi-dimensional arrays, with arbitrarily complex element types
综合实例1:
public class ExampleBean { private String name; private String id; private int age; private boolean isOk; public ExampleBean(String name, String id, int age, boolean isOk) { super(); this.name = name; this.id = id; this.age = age; this.isOk = isOk; } public ExampleBean() { } //setter和getter方法 }
测试:
public static void main(String[] args) { Gson gson = new Gson(); List<ExampleBean> list = new ArrayList<ExampleBean>(); for (int i = 0; i < 5; i++) { String name = "xxlong" + i; int age = 20 + i; ExampleBean bean = new ExampleBean(name, i + "", age); list.add(bean); } Type listType = new TypeToken<List<ExampleBean>>() { }.getType(); //将list转化成json字符串 String json = gson.toJson(list); System.out.println(json); //将json字符串还原成list List<ExampleBean> list2 = gson.fromJson(json, listType); }
输出如下:[{"name":"xxlong0","id":"0","age":20,"isOk":false},{"name":"xxlong1","id":"1","age":21,"isOk":false},{"name":"xxlong2","id":"2","age":22,"isOk":false},{"name":"xxlong3","id":"3","age":23,"isOk":false},{"name":"xxlong4","id":"4","age":24,"isOk":false}]
综合实例2:
需求:想将字符串{'tableName' :'ys_index_y','year': '2008','params':'[z_expense,z_expense_profit,z_main_margin]','isOperAll':'false','copyToYear':''}还原成对象OpeerConditions,OpeerConditions对象代码如下所示
public class OperConditions { private String tableName; private String year; private String[] params; private boolean isOperALl; private String copyToYear; public OperConditions() { } public OperConditions(String tableName, String year, String[] params, boolean isOperALl, String copyToYear) { super(); this.tableName = tableName; this.year = year; this.params = params; this.setOperALl(isOperALl); this.copyToYear = copyToYear; } //getter和setter方法 }
因为OperConditions中有属性params,它是一个数组,所以无论是用json lib还是gson都不能直接将上面的字符串还原成OperCondtions对象,可以直接将params分离出来,单独处理,我这里选用此种方法来处理:
json-lib代码如下:
public static void main(String[] args) { String json = "{'tableName' :'ys_index_y','year': '2008','isOperAll':'false','copyToYear':''}"; JSONObject jsonObj = JSONObject.fromObject( json ); OperConditions conditions = (OperConditions) JSONObject.toBean( jsonObj, OperConditions.class ); System.out.println(conditions.isOperALl() == false); //==>输出为true String json1 = "['z_expense','z_expense_profit','z_main_margin']"; JSONArray jsonArray = JSONArray.fromObject(json1); //List<String> list = jsonArray.toList(jsonArray); //这个方法也可以 List<String> list = jsonArray.toList(jsonArray,String.class); conditions.setParams(list.toArray(new String[0])); System.out.println(conditions.getParams()[0]); //==>输出为z_expense }
因为JSONArray的toArray()方法返回的是一个Object[]数组,所以先将它转化成list,再转化到String数组。
当然由JSONArray转化成list时也可以使用subList方法,如下所示:
List<String> list = jsonArray.subList(0, jsonArray.size());
或者可以直接使用JSONArray的iterator() 方法迭代它本身直接得到需要的String数组。
如果使用Gson来完成这一需求,个人感觉更简单,代码如下所示:
public static void main(String[] args) { String json = "{'tableName' :'ys_index_y','year': '2008','isOperAll':'false','copyToYear':''}"; Gson gson = new Gson(); OperConditions conditions = gson.fromJson(json, OperConditions.class); System.out.println(conditions.isOperALl() == false); // ==>输出为true String json1 = "['z_expense','z_expense_profit','z_main_margin']"; String[] params = gson.fromJson(json1,String[].class); conditions.setParams(params); System.out.println(conditions.getParams()[0]); // ==>输出为z_expense }
Gson可以直接转化成String[]数组,同时转化OperConditions时也比json-lib简单。
还有一点是非常值得注意的,就是你的bean中有boolean属性值时,强烈建议你别像我这个例子中一样命名为以is开头的属性名,这可能给你带来意想不到的错误,关于这一点的详细解说请参看我的文章json lib 学习笔记
【转载地址】
http://ryxxlong.iteye.com/blog/736783
发表评论
-
个人草稿使用
2017-08-19 09:02 0深入理解JVM: http://www.cnblogs.co ... -
Thread.setDaemon详解
2015-04-24 21:31 926java中线程分为两种类型:用户线程和守护线程。通过Threa ... -
怎么使用 ConcurrentHashMap 才能是线程安全的?
2015-04-13 11:54 1522public class test { public ... -
21,tomcat关闭钩子
2014-12-31 10:36 740在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于 ... -
Java NIO使用及原理分析 (一) 【转载】
2014-10-24 00:04 497【转载】: http://blog.csdn.net/wuxi ... -
Java 两个集合取交集
2014-10-14 21:16 3148public static Set intersectionS ... -
Calendar类roll和add的区别
2014-10-10 22:28 505import java.text.SimpleDateForm ... -
Gson通过借助TypeToken获取泛型参数的类型的方法
2014-09-30 00:26 639[size=medium]最近在使用Goo ... -
HashMap的遍历效率讨论
2014-09-27 20:41 844经常遇到对HashMap中的key和value值对的遍历操作, ... -
Java 泛型
2014-06-26 12:44 871关键字说明 ? 通配符类型 <? extends T&g ... -
Java泛型集合的理解
2014-06-26 00:05 516[size=medium]什么是泛型? 泛型(Generic ... -
关于java字节码框架ASM的学习
2014-06-19 19:22 900一、什么是ASM ASM是一个java字节码操纵框架, ... -
Java动态代理详解
2014-06-19 17:41 871Java动态代理详解: http: ... -
Java内存,字符串文章收集
2014-06-18 16:24 743java--String常量池问题的几个例子 . http:/ ... -
Java内存解析
2014-06-18 11:48 788栈、堆、常量池等虽同 ... -
Java的堆与非堆内存
2014-01-07 10:59 732堆(Heap)和非堆(Non-heap)内存 按照官方的说法: ... -
JMX 资料收集
2014-01-07 10:53 485JavaSky的专栏 http://blog.csdn.net ... -
JAVA 注解示例 详解
2013-11-12 09:36 836注解(Annotation) 为我们在代码中天界信息提供了 ... -
Java 泛型详解
2013-11-11 22:35 840http://www.360doc.com/content/1 ... -
Java中的Enum的使用与分析
2013-11-09 12:49 831enum枚举类型:在实际问 ...
相关推荐
这个学习笔记主要围绕`json-lib`的使用方法和关键特性进行阐述。 首先,`json-lib`支持多种Java对象到JSON的转换,包括基本类型、数组、集合、Map以及自定义的Java类。例如,你可以通过以下方式将一个HashMap转换为...
3. JSON对象与JSON数组的创建:学习笔记可能介绍如何使用JSON-lib创建JSON对象和数组。例如,你可以通过`net.sf.json.JSONObject`和`net.sf.json.JSONArray`类来实现。 4. Java对象转换为JSON:JSON-lib提供了`...
在Android客户端,解析JSON数据通常使用`org.json`库(已包含在Android SDK中)或者第三方库如Gson、Jackson、FastJson等。以下是一个使用`org.json`库解析JSON对象的例子: ```java import org.json.JSONArray; ...
例如,Apache Tomcat服务器需要的Servlet和JSP API,Spring框架的库,Hibernate的ORM库,或者JSON解析库(如Jackson或Gson)。开发者在构建项目时,会将这些库添加到类路径(classpath)中,使得项目在编译和运行时...
服务器返回的数据通常以JSON格式呈现,客户端需要解析JSON数据,可以使用Gson、Jackson或org.json等库进行解析。 14. 处理servlet中乱码 在Servlet中处理乱码问题,需要确保请求参数的编码与服务器接收的编码一致,...