JSON 就是一种轻量级的数据交换格式,被广泛应用于 WEB 应用程序开发。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
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 设置某个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