(一) Java本身自带的序列化与反序列化方式Serializable
参考:https://www.cnblogs.com/zhangmingyang/p/10445581.html
(二) 通用的序列化与反序列化方式JSON
fastjson所需的jar包和源码:https://download.csdn.net/download/xinsuimengfei/10451717
FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到
JavaBean。FastJson已经被广泛使用在各种场景,包括cache存储、RPC通讯、MQ通讯、网络协议通讯、Android客户端、Ajax服务器处理程序等等。
参考博客:
https://www.cnblogs.com/qiaoyeye/p/7730288.html
https://blog.csdn.net/m0_37598340/article/details/86490373
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
参考方法:
- 将对象序列化成json字符串
public static final String toJSONString(Object object); // 序列化为无格式的json字符串
public static final String toJSONString(Object object, boolean prettyFormat); // 序列化为带格式的json字符串
- 将json字符串反序列化成JSONObject或者JSONArray(返回值是Object类型,不要使用了,不然还需要强转,直接用3吧.)
public static final Object parse(String text);
- 将json字符串反序列化成对象(如果你拿到的数据是数组,需要加上参数JSONArray.class,否则报错.)
public static final JSONObject parseObject(String text); // 将JSON字符串反序列化成JSON对象
public static final T parseObject(String text, Class clazz); // 将JSON字符串反序列化成对象
4.根据key 得到json中的json数组
public JSONArray getJSONArray(String key)
- 根据下标拿到json数组的json对象
public JSONObject getJSONObject(int index)
6.根据key拿到json的字符串值
String com.alibaba.fastjson.JSONObject.getString(String key)
- 根据key拿到json的int值
int com.alibaba.fastjson.JSONObject.getIntValue(String key)
- 根据key拿到json的boolean值
boolean com.alibaba.fastjson.JSONObject.getBooleanValue(String key)
参考示例1:
1 package com.zmy.faskjson;
2
3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONArray;
5 import com.alibaba.fastjson.JSONObject;
6
7 public class test3
8 {
9 public static void main(String[] args)
10 {
11 String json_str = “{“reviewPics”:null,“extInfoList”:[{“title”:“contentTags”,“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“desc”:“true”,“defineType”:0},{“title”:“tagIds”,“values”:[“24”,“300”,“852”,“506”,“173”],“desc”:”",“defineType”:0}],“expenseList”:null,“reviewIndexes”:[2],“scoreList”:null}";
12 System.out.println(json_str);
13
14 //将json字符串反序列化成JSON对象
15 JSONObject parseObject = JSON.parseObject(json_str);
16 System.out.println(parseObject);
17
18 //根据key得到json对象当中的json数组
19 JSONArray jsonArray = parseObject.getJSONArray(“extInfoList”);
20 System.out.println(jsonArray);
21
22 //根据下标拿到json数组当中的json对象
23 JSONObject jsonObject = jsonArray.getJSONObject(0);
24 System.out.println(jsonObject);
25
26 //根据key拿到json对象的字符串值
27 String string = jsonObject.getString(“title”);
28 System.out.println(string);
29
30 //根据key拿到json对象的boolean值
31 Boolean boolean1 = jsonObject.getBoolean(“desc”);
32 System.out.println(boolean1);
33
34 //根据key拿到json对象的int值
35 Integer integer = jsonObject.getInteger(“defineType”);
36 System.out.println(integer);
37 }
38 }
运行结果:
{“reviewPics”:null,“extInfoList”:[{“title”:“contentTags”,“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“desc”:“true”,“defineType”:0},{“title”:“tagIds”,“values”:[“24”,“300”,“852”,“506”,“173”],“desc”:"",“defineType”:0}],“expenseList”:null,“reviewIndexes”:[2],“scoreList”:null}
{“reviewIndexes”:[2],“extInfoList”:[{“title”:“contentTags”,“desc”:“true”,“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“defineType”:0},{“title”:“tagIds”,“desc”:"",“values”:[“24”,“300”,“852”,“506”,“173”],“defineType”:0}]}
[{“title”:“contentTags”,“desc”:“true”,“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“defineType”:0},{“title”:“tagIds”,“desc”:"",“values”:[“24”,“300”,“852”,“506”,“173”],“defineType”:0}]
{“title”:“contentTags”,“desc”:“true”,“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“defineType”:0}
contentTags
true
0
示例程序2:
public class User
{
private Integer id;
private String name;
private Integer age;
@JSONField(format="yyyy-MM-dd")
private Date createtime;
private String phone;
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getAge()
{
return age;
}
public void setAge(Integer age)
{
this.age = age;
}
public Date getCreatetime()
{
return createtime;
}
public void setCreatetime(Date createtime)
{
this.createtime = createtime;
}
public String getPhone()
{
return phone;
}
public void setPhone(String phone)
{
this.phone = phone;
}
@Override
public String toString()
{
return "User [id=" + id + ", name=" + name + ", age=" + age+ ", createtime=" + createtime + ", phone=" + phone + "]";
}
}
代码:
1 import java.util.Date;
2
3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONObject;
5
6 public class Test5
7 {
8 public static void main(String[] args)
9 {
10 User user = new User();
11 user.setId(123456);
12 user.setName(“wtt”);
13 user.setAge(28);
14 user.setCreatetime((Date) new Date());
15
16 System.out.println(user);
17
18 //将对象序列化成json字符串
19 String jsonString = JSON.toJSONString(user,true);
20 System.out.println(jsonString);
21
22 //将json字符串反序列化成JSONObject对象
23 JSONObject parseObject1 = JSON.parseObject(jsonString);
24 System.out.println(parseObject1);
25
26
27 //将json字符串反序列化成JavaBean对象
28 User parseObject = JSON.parseObject(jsonString,User.class);
29 System.out.println(parseObject);
30
31
32
33 }
34 }
运行结果:
User [id=123456, name=wtt, age=28, createtime=Fri Jun 07 16:17:54 CST 2019, phone=null]
{
“age”:28,
“createtime”:“2019-06-07”,
“id”:123456,
“name”:“wtt”
}
{“id”:123456,“createtime”:“2019-06-07”,“name”:“wtt”,“age”:28}
User [id=123456, name=wtt, age=28, createtime=Fri Jun 07 00:00:00 CST 2019, phone=null]
遍历JSON对象的方法:
package com.base.java.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.Map;
public class app2
{
//遍历JSON 对象({} [])
public static void main(String[] args)
{
//json字符串.
String json_str = “{255:“L1标签”,1225:“核心流量标签”}”;
//将json字符串反序列化成json对象,并进行遍历.
JSONObject jsonObject = JSON.parseObject(json_str);
System.out.println(jsonObject);
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
System.out.println((Object)entry.getKey());
System.out.println(entry.getValue());
}
//json字符串.
String json_str2 = "[\"1253\",\"3625\"]";
//将json字符串反序列化成json对象,并进行遍历.
JSONArray objects = JSON.parseObject(json_str2, JSONArray.class);
for ( Object obj : objects)
{
System.out.println((String) obj);
}
}
}
运行结果:
{1225:“核心流量标签”,255:“L1标签”}
1225
核心流量标签
255
L1标签
1253
3625
(三) 使用fastjson时,null值在转JSONObject时丢失的问题
参考博客:https://blog.csdn.net/litterfrog/article/details/80083626
package com.base.java.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.util.Map;
public class app
{
public static void main(String[] args)
{
//json字符串.
String json_str = “{“reviewPics”:null,“extInfoList”:[{“title”:“contentTags”,“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“desc”:“true”,“defineType”:0},{“title”:“tagIds”,“values”:[“24”,“300”,“852”,“506”,“173”],“desc”:”",“defineType”:0}],“expenseList”:null,“reviewIndexes”:[2],“scoreList”:null}";
System.out.println(json_str);
//将json字符串反序列化成json对象,但是空值为什么没有了呢?
JSONObject jsonObject = JSON.parseObject(json_str);
System.out.println(jsonObject.toString());
//临时的几个方法.
System.out.println(jsonObject.containsKey("reviewPics"));
System.out.println(jsonObject.get("reviewPics"));
System.out.println(jsonObject.containsKey("tmp_key"));
System.out.println(jsonObject.get("tmp_key"));
//将空值也给打出来.
System.out.println(jsonObject.toJSONString()); //不行.
System.out.println(JSONObject.toJSONString(jsonObject, SerializerFeature.WriteMapNullValue)); //行.
//遍历这个json对象,会发现空值null也打印出来了.
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
System.out.println((Object)entry.getKey());
System.out.println(entry.getValue());
}
}
}
运行结果:
{“reviewPics”:null,“extInfoList”:[{“title”:“contentTags”,“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“desc”:“true”,“defineType”:0},{“title”:“tagIds”,“values”:[“24”,“300”,“852”,“506”,“173”],“desc”:"",“defineType”:0}],“expenseList”:null,“reviewIndexes”:[2],“scoreList”:null}
{“extInfoList”:[{“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“defineType”:0,“title”:“contentTags”,“desc”:“true”},{“values”:[“24”,“300”,“852”,“506”,“173”],“defineType”:0,“title”:“tagIds”,“desc”:""}],“reviewIndexes”:[2]}
true
null
false
null
{“extInfoList”:[{“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“defineType”:0,“title”:“contentTags”,“desc”:“true”},{“values”:[“24”,“300”,“852”,“506”,“173”],“defineType”:0,“title”:“tagIds”,“desc”:""}],“reviewIndexes”:[2]}
{“scoreList”:null,“extInfoList”:[{“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“defineType”:0,“title”:“contentTags”,“desc”:“true”},{“values”:[“24”,“300”,“852”,“506”,“173”],“defineType”:0,“title”:“tagIds”,“desc”:""}],“reviewPics”:null,“reviewIndexes”:[2],“expenseList”:null}
scoreList
null
extInfoList
[{“values”:[“环境优雅”,“性价比高”,“干净卫生”,“停车方便”,“音响效果好”],“defineType”:0,“title”:“contentTags”,“desc”:“true”},{“values”:[“24”,“300”,“852”,“506”,“173”],“defineType”:0,“title”:“tagIds”,“desc”:""}]
reviewPics
null
reviewIndexes
[2]
expenseList
null