Fastjson的常用方法总结

JSON简单介绍
  JSON 就是一种轻量级的数据交换格式,被广泛应用于 WEB 应用程序开发。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
fastjson的使用
  fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
  在项目中添加fastjson的依赖(maven中央仓库可以直接查找到依赖信息)
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.70</version>
</dependency>
json对象与map、java对象、list的相互转换
public class FastJsonTest {
	public static void main(String[] args) {
		// json字符串
		String json = "{"code":"U0022S00001","fieldName":null,"yhzh":"620071008398037654","sfzhm":"330681199309146269","qysh":"9133060231121732XN","email":"18325672253@163.com","phone":"18312354321","name":"数据资源版本","dataSource":"资源来源","templateDataId":3}";
		System.out.println("处理前字段信息: " + json + "
");
		/*
		 * 1. 字符串 与 json对象 的相互转换
		 */
		JSONObject jsonObject = JSONObject.parseObject(json);
		System.out.println("字符串转json对象:" + jsonObject);
		// Feature.OrderedField 可以固定字段顺序,使得转为jsonobject之后的字段顺序与原来的json字符串一致
		JSONObject jsonObject2 = JSONObject.parseObject(json, Feature.OrderedField);
		System.out.println("字符串转json对象[固定字段顺序]:" + jsonObject2);

		String jsonStr = JSONObject.toJSONString(jsonObject);
		System.out.println("json对象转字符串 :" + jsonStr);
		// 
		String jsonStr2 = JSONObject.toJSONString(jsonObject, SerializerFeature.WriteMapNullValue);
		System.out.println("json对象转字符串[保留value为null的字段] :" + jsonStr2 + "
");
		
		/*
		 * 2. map 与 jsonobject的转换
		 */
		Map<String, Object> map = new HashMap<>();
		Set<String> set = jsonObject.keySet();
		for (String key : set) {
			map.put(key, jsonObject.get(key));
		}
		Iterator<Entry<String, Object>> it = jsonObject.entrySet().iterator();
		while (it.hasNext()) {
			Entry<String, Object> entry = it.next();
			map.put(entry.getKey(), entry.getValue());
		}
		System.out.println("jsonobject转为 map:" + map);

		String map2str = JSON.toJSONString(map);
		JSONObject map2json = JSONObject.parseObject(map2str);
		System.out.println("map转jsonobject:" + map2json + "
");

		/*
		 * 3.javabean 与 jsonobject转换
		 * java对象需要实现getter/setter方法,否则数据无法填充
		 * 
		 * fastjson在对java对象进行序列化时,会抛弃值为null的key;需要设置SerializerFeature序列化属性
		 * 
		 */
		BaseBean baseBean = JSON.parseObject(json, BaseBean.class);
		System.out.println("jsonobject转为java对象:" + baseBean);
		String bean2jsonStr = JSON.toJSONString(baseBean, SerializerFeature.DisableCircularReferenceDetect);
		JSONObject bean2json = JSONObject.parseObject(bean2jsonStr);
		System.out.println("java对象转为json对象:" + bean2json + "
");

		/*
		 * 4. list与json对象转换 json 转为list之后,就是一个数组,再转换为json的时候,应转为jsonarray.
		 */
		List list = java.util.Arrays.asList(jsonObject);
		List list2 = Collections.singletonList(jsonObject);
		System.out.println("json 转 list : " + list2);
		String list2jsonStr = JSON.toJSONString(list2);
		JSONArray list2json = JSONArray.parseArray(list2jsonStr);
		System.out.println("list 转 jsonobject : " + list2json + "
");
		
//		jsonObject.put("111", null);
//		System.out.println("设置value为null : " + jsonObject);
	}

	private static class BaseBean {
		private String code;
		private String fieldName;
		private String yhzh;
		private String sfzhm;
		private String qysh;
		private String email;
		private String phone;
		private String name;
		private String dataSource;
		private String templateDataId;

		//省略 getter/setter部分
	}
}
其他常用基本方法如下:

size()   # json对象长度;
isEmpty()   # json对象是否为空;
containsKey(Object key)   #是否包含某个指定key;
containsValue(Object value);   #是否包含某个指定value;
get(Object key);   # 获取指定key对应的value
getJSONObject(String key);   # 获取指定key对应的value,value为json对象
getJSONArray(String key);   # 获取指定key对应的value,value为JSONArray
getBytes(String key);   # 获取指定key对应value值的byte数组

put(String key, Object value);   # 设置键值对,key不允许重复
clear();   # 清空json对象


JSONObject 本质还是 map,有与map相同的两个方法:
Set keySet();   # 获取key的Set集合
Set<Map.Entry<String, Object>> entrySet();   # 获取JSONObject的键值对集合,常用json对象的遍历。

fastjson对于null值的处理

  fastjson 设置某个key的value为null, 在序列化输出时,会丢失这个key 。这里需要时会用 SerializerFeature.WriteMapNullValue 序列化属性设置,使null值输出。
SerializerFeature序列化属性如下:
QuoteFieldNames  # 输出key时是否使用双引号,默认为true
WriteMapNullValue   # 是否输出值为null的字段,默认为false
WriteNullNumberAsZero   # 数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty    # List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty    #字符类型字段如果为null,输出为”“,而非null
WriteNullBooleanAsFalse    # Boolean字段如果为null,输出为false,而非null

原文地址:https://www.cnblogs.com/waiting-ying/p/13050884.html