文章目录
- 1.基本的序列化
- 例1:将Map转成JSON
- 例2:将List转成JSON。
- 例3:自定义JavaBean User转成JSON。
- 例4:以例2代码为例。
- 1.日期格式化:
- 例5:FastJSON将java.util.Date转成long。
- 例6:使用SerializerFeature特性格式化日期。
- 例7:指定输出日期格式。
- 例12:将例11反序列化。
- 例13:将例3反序列化。
- 例14:将例2反序列化。
- 例15:将例1反序列化。
- 例16:将Map转成JSONObject,然后添加元素,输出。
- 例17:将List对象转成JSONArray,然后输出。
- JSONObject详解
- 例18 1.通过原生生成json数据格式。
- 例19. 通过hashMap数据结构生成
- 例20 通过实体生成
- JSONArray详解
- 如何从字符串String获得JSONObject对象和JSONArray对象
- 如何从JSONArray中获得JSONObject对象
- 获取JSON内的数据
FastJSON是一个Java语言编写的高性能,功能完善,完全支持http://json.org的标准的JSON库。多了不说了,百度一下一大把。
在此,简单的总结一下自己用过,测试过的方法。JSONObject,JSONArray是JSON的两个子类。
如果使用Maven,在pom.xml文件加入以下依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.23</version>
</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");
4
5 String mapJson = JSON.toJSONString(map);
输出结果:
{"key1":"One","key2":"Two"}
例2:将List转成JSON。
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("key1", "One");
map1.put("key2", "Two");
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("key1", "Three");
map2.put("key2", "Four");
list.add(map1);
list.add(map2);
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);
4
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);
输出结果为:
[
{
"key1":"One",
"key2":"Two"
},
{
"key3":"Three",
"key4":"Four"
}
]
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());
2
3 System.out.println(dateJson);
输出结果:
1401370199040
例6:使用SerializerFeature特性格式化日期。
1 String dateJson = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat);
2
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");
2
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格式化。
例9:
String listJson = JSON.toJSONString(list, SerializerFeature.PrettyFormat);
输出结果:与例4结果一致。
4.输出Null字段。
缺省情况下FastJSON不输入为值Null的字段,可以使用SerializerFeature.WriteMapNullValue使其输出。
例10:
1 Map<String, Object> map = new HashMap<String,Object>();
2
3 String b = null;
4 Integer i = 1;
5
6 map.put("a", b);
7 map.put("b", i);
8
9 String listJson = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue);
输出结果:
{"a":null,"b":1}
5.序列化是写入类型信息。
例11:
1 User user = new User();
2
3 user.setAge(18);
4 user.setUserName("李四");
5
6 String listJson = JSON.toJSONString(user, SerializerFeature.WriteClassName);
输出结果:
{"@type":"User","age":18,"userName":"李四"}
由于序列化带了类型信息,使得反序列化时能够自动进行类型识别。
例12:将例11反序列化。
1 User user1 = (User) JSON.parse(listJson);
2
3 System.out.println(user1.getAge());
输出结果:
18
如果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);
2
3 for(Map<String, Object> map : list1){
4 System.out.println(map.get("key1"));
5 System.out.println(map.get("key2"));
6 }
输出结果:
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。
简单方法示例:
例16:将Map转成JSONObject,然后添加元素,输出。
1 Map<String, Object> map = new HashMap<String, Object>();
2 map.put("key1", "One");
3 map.put("key2", "Two");
4
5 JSONObject j = new JSONObject(map);
6
7 j.put("key3", "Three");
8
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>>();
2
3 Map<String, Object> map = new HashMap<String, Object>();
4 map.put("key1", "One");
5 map.put("key2", "Two");
6
7 Map<String, Object> map2 = new HashMap<String, Object>();
8 map2.put("key1", "Three");
9 map2.put("key2", "Four");
10
11 list.add(map);
12 list.add(map2);
13
14 JSONArray j = JSONArray.parseArray(JSON.toJSONString(list));
15
16 for(int i=0; i<j.size(); i++){
17 System.out.println(j.get(i));
18 }
输出结果:
1 {"key1":"One","key2":"Two"}
2 {"key1":"Three","key2":"Four"}
更多方法使用请参考API(没有注释的API,让我很头疼啊)。
end
简单附上自己写的json工具类:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class MyJsonUtil {
private static final SerializerFeature[] features = {SerializerFeature.WriteMapNullValue, // 输出空置字段
// SerializerFeature.WriteNullListAsEmpty,
// // list字段如果为null,输出为[],而不是null
// SerializerFeature.WriteNullNumberAsZero,
// // 数值字段如果为null,输出为0,而不是null
// SerializerFeature.WriteNullBooleanAsFalse,
// // Boolean字段如果为null,输出为false,而不是null
// SerializerFeature.WriteNullStringAsEmpty,
// // 字符类型字段如果为null,输出为"",而不是null
SerializerFeature.WriteDateUseDateFormat // 日期格式化yyyy-MM-dd
// HH:mm:ss
};
public static String toJson(Object object) {
return JSON.toJSONString(object, features);
}
}
JSONObject详解
SONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
例18 1.通过原生生成json数据格式。
JSONObject zhangsan = new JSONObject();
try {
//添加
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.put("birthday", "1900-20-03");
zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
zhangsan.put("null", null);
zhangsan.put("house", false);
System.out.println(zhangsan.toString());
} catch (JSONException e) {
e.printStackTrace();
}
例19. 通过hashMap数据结构生成
HashMap<String, Object> zhangsan = new HashMap<>();
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.put("birthday", "1900-20-03");
zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
zhangsan.put("null", null);
zhangsan.put("house", false);
System.out.println(new JSONObject(zhangsan).toString());
例20 通过实体生成
User zhangsan=new User();
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.put("birthday", "1900-20-03");
zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
zhangsan.put("null", null);
zhangsan.put("house", false);
System.out.println(new JSONObject(zhangsan));
JSONArray详解
JSONObject的数据是用 { } 来表示的,
例如: { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "content" : null }
JSONArray,顾名思义是由JSONObject构成的数组,用 [ { } , { } , … , { } ] 来表示
例如: [ { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业" } , { "content" : null, "beginTime" : 1398873600000 "endTime" } ] ;
表示了包含2个JSONObject的JSONArray。
可以看到一个很明显的区别,一个最外面用的是 { } ,一个最外面用的是 [ ] ;
如何从字符串String获得JSONObject对象和JSONArray对象
JSONObject jsonObject = new JSONObject ( String str);
JSONArray jsonArray = new JSONArray(String str ) ;
如何从JSONArray中获得JSONObject对象
可以把JSONArray当成一般的数组来对待,只是获取的数据内数据的方法不一样
JSONObject jsonObject = jsonArray.getJSONObject(i) ;
获取JSON内的数据
int mid= jsonObject.getInt ( "id" ) ; // 这里的mid得到的数据就是123.
String mcourse=jsonObject.getString( " courseID") ; // 这里的mcourse得到的数据就是huangt-test.