添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
7 map.put("b", i); 9 String listJson = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue);

输出结果:

{"a":null,"b":1}

JSONObject data1 = JSONObject.parseObject(json);
String string = JSON.toJSONString(data1, SerializerFeature.WriteMapNullValue);

System.out.println(string);

Fastjson的SerializerFeature序列化属性

QuoteFieldNames———-输出key时是否使用双引号,默认为true
WriteMapNullValue——–是否输出值为null的字段,默认为false
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

FastJSON是一个Java语言编写的高性能,功能完善, 完全支持 http://json.org 的标准 的JSON库。多了不说了, 百度一下 一大把。

在此,简单的总结一下自己用过,测试过的方法。

如果使用Maven,在pom.xml文件加入以下依赖。

1 <dependency>
2     <groupId>com.alibaba</groupId>
3     <artifactId>fastjson</artifactId>
4     <version>1.1.23</version>
5 </dependency>

序列化就是指 把JavaBean对象转成JSON格式的字符串。

com.alibaba.fastjson.JSON提供了许多方法(多态)实现序列化。

1.基本的序列化

String objJson = JSON.toJSONString(Object object);

传入一个对象,将对象转成JSON字符串。

例1:将Map转成JSON

1 Map<String, Object> map = new HashMap<String, Object>();
2 map.put("key1", "One");
3 map.put("key2", "Two");
5 String mapJson = JSON.toJSONString(map);

输出结果:

{"key1":"One","key2":"Two"}

例2:将List<Map>转成JSON。

 1 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
 3 Map<String, Object> map1 = new HashMap<String, Object>();
 4 map1.put("key1", "One");
 5 map1.put("key2", "Two");
 7 Map<String, Object> map2 = new HashMap<String, Object>();
 8 map2.put("key1", "Three");
 9 map2.put("key2", "Four");
11 list.add(map1);
12 list.add(map2);
14 String listJson = JSON.toJSONString(list);

输出结果:

[{"key1":"One","key2":"Two"},{"key3":"Three","key4":"Four"}]

例3:自定义JavaBean User转成JSON。

1 User user = new User();
2 user.setUserName("李四");
3 user.setAge(24);
5 String userJson = JSON.toJSONString(user);

输出结果:

{"age":24,"userName":"李四"}

可以输出格式化后的 JSON 字符串。

String objJson = JSON.toJSONString(Object object, boolean prettyFormat);

传入一个对象和一个布尔类型(是否格式化),将对象转成格式化后的JSON字符串。

例4:以例2代码为例。

String listJson = JSON.toJSONString(list, true);

输出结果为:

2 { 3 "key1":"One", 4 "key2":"Two" 5 }, 6 { 7 "key3":"Three", 8 "key4":"Four" 9 }

FastJSON提供了许多特性支持。

String objJson = JSON.toJSONString(Object object, SerializerFeature... features) 

传入一个对象和SerializerFeature类型的可变变量。SerializerFeature是一个枚举。

com.alibaba.fastjson.serializer.SerializerFeature

你可以根据自己的情况使用这些特性。

简单说下几个常用的特性:

1.日期格式化:

FastJSON可以直接对日期类型格式化,在缺省的情况下,FastJSON会将Date转成long。

例5:FastJSON将java.util.Date转成long。

1 String dateJson = JSON.toJSONString(new Date());
3 System.out.println(dateJson);

输出结果:

1401370199040

例6:使用SerializerFeature特性格式化日期。

1 String dateJson = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat);
3 System.out.println(dateJson);

输出结果:

"2014-05-29 21:36:24"

也可以指定输出日期格式。

例7:指定输出日期格式。

1 String dateJson = JSON.toJSONStringWithDateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
3 System.out.println(dateJson);

输出结果:

"2014-05-29 21:47:00.154"

2.使用单引号。

例8:以例2为例。

String listJson = JSON.toJSONString(list, SerializerFeature.UseSingleQuotes);

输出结果:

[{'key1':'One','key2':'Two'},{'key3':'Three','key4':'Four'}]

3.JSON格式化。

String listJson = JSON.toJSONString(list, SerializerFeature.PrettyFormat);

输出结果:与例4结果一致。

4.输出Null字段。

 缺省情况下FastJSON不输入为值Null的字段,可以使用SerializerFeature.WriteMapNullValue使其输出。

1 Map<String, Object> map = new HashMap<String,Object>();
3 String b = null;
4 Integer i = 1;
6 map.put("a", b);
7 map.put("b", i);
9 String listJson = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue);

输出结果:

{"a":null,"b":1}

5.序列化是写入类型信息。

1 User user = new User();
3 user.setAge(18);
4 user.setUserName("李四");
6 String listJson = JSON.toJSONString(user, SerializerFeature.WriteClassName);

输出结果:

{"@type":"User","age":18,"userName":"李四"}

由于序列化带了类型信息,使得反序列化时能够自动进行类型识别。

例12:将例11反序列化。

1 User user1 = (User) JSON.parse(listJson);
3 System.out.println(user1.getAge());

输出结果:

如果User序列化是没有加入类型信息(SerializerFeature.WriteClassName),按照例12的做法就会报错(java.lang.ClassCastException)。

反序列化就是把JSON格式的字符串转化为Java Bean对象。

com.alibaba.fastjson.JSON提供了许多方法(多态)实现反序列化。

 简单举几个例子。

指定Class信息反序列化。

例13:将例3反序列化。

1 User user1 = JSON.parseObject(userJson, User.class);
2 System.out.println(user1.getUserName());

输出结果:

集合反序列化。

例14:将例2反序列化。

1 List<Map> list1 = JSON.parseArray(listJson, Map.class);
3 for(Map<String, Object> map : list1){
4     System.out.println(map.get("key1"));
5     System.out.println(map.get("key2"));         

输出结果:

1 One
2 Two
3 Three
4 Four

泛型的反序列化(使用TypeReference传入类型信息)。

例15:将例1反序列化。

1 Map<String, Object> map1 = JSON.parseObject(mapJson, new TypeReference<Map<String, Object>>(){});
2 System.out.println(map1.get("key1"));
3 System.out.println(map1.get("key2"));

输出结果:

1 One
2 Two

---------------------------------------------------------------------------------------------------------------------------------------------------------

JSONObject,JSONArray是JSON的两个子类。

JSONObject相当于Map<String, Object>,

JSONArray相当于List<Object>。

简单方法示例:

例16:将Map转成JSONObject,然后添加元素,输出。

 1 Map<String, Object> map = new HashMap<String, Object>();
 2 map.put("key1", "One");
 3 map.put("key2", "Two");
 5 JSONObject j = new JSONObject(map);
 7 j.put("key3", "Three");
 9 System.out.println(j.get("key1"));
10 System.out.println(j.get("key2"));
11 System.out.println(j.get("key3"));

输出结果:

1 One
2 Two
3 Three

例17:将List对象转成JSONArray,然后输出。

 1 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
 3 Map<String, Object> map = new HashMap<String, Object>();
 4 map.put("key1", "One");
 5 map.put("key2", "Two");
 7 Map<String, Object> map2 = new HashMap<String, Object>();
 8 map2.put("key1", "Three");
 9 map2.put("key2", "Four");
11 list.add(map);
12 list.add(map2);
14 JSONArray j = JSONArray.parseArray(JSON.toJSONString(list));
16 for(int i=0; i<j.size(); i++){
17     System.out.println(j.get(i));

输出结果:

1 {"key1":"One","key2":"Two"}
2 {"key1":"Three","key2":"Four"}

更多方法使用请参考API(没有注释的API,让我很头疼啊)。

原文地址:http://www.cnblogs.com/Jie-Jack/p/3758046.html

原文链接:https://mp.csdn.net/postedit/66973627 代码逻辑:当bean字段有@JSONField注解,其serialzeFeatures有且仅有SerializerFeature.WriteMapNullValue时,序列化为null,否则按默认逻辑(序列化为对应得默认值)默认SerializerFeature.WriteNullBooleanAsFalse。默认SerializerFeature.WriteNullStringAsEmpty。~ 是按位取反,如4按位取反后得-5。& 是按位“与”,都1得1。| 是按位“或”,有1得1。 import com.alibaba.fastjson.JSON Map<String, Object> map = new HashMap<String, Object>(); String toJSON = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue, Seri 最近因项目需要,从零开始重新搭建了一套框架给同事们用。在前后端对接的时候,发现后端提供的字段缺少了很多,即实体类为null的字段,全部被过滤了。经排查,是fastjson的锅。因为fastjson默认就把value为null给过滤掉,不输出空。俗话说,当你遇见问题时,找到问题的原因,你的问题就已经解决了一半。 Map &lt; String , Object &gt; jsonMap = new HashMap&lt; String , Object&gt;(); jsonMap.put("a",1); jsonMap.put("b",""); jsonMap... // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) package com.alibaba.fastjson.serializer; public enum SerializerF... 在使用fastjson调用JSON.toJSONString(obj);方法将对象转换为json字符串时,如果对象obj的属性字段有null时,该属性字段不会被序列化。 同时,我们还使用了FastJson提供的@JSONType注解,其中serialzeFeatures属性设置为SerializerFeature.WriteMapNullValue,表示在序列化对象时保留为null的字段。在上述测试代码中,我们创建了一个User对象,并设置了userId和userName字段的,而email字段为null。在使用FastJson进行对象转换时,有时候我们希望保留源对象中为null的字段,在转换后的对象中也保留这些字段。如有任何疑问,请随时提问。