该文章主要介绍com.alibaba.fastjson的使用。

首先创建maven工程,导入fastjson.挑个热度高的版本就好了。

首先考虑下,我们通常什么时候会使用序列化和反序列化:

1.将java对象序列化为一个JSON字符串

// 将javaBean转换成json字符串,有一个Student对象stu1
//Student对象直接输出为Student [id=20180306, name=Claire, age=18, gender=girl]
String stuToJsonStr1 = JSON.toJSONString(stu1);
System.out.println("Student的一个对象通过 JSON.toJSONString转换成字符串格式"+stuToJsonStr1); String stuToJsonStr2 = JSONObject.toJSONString(stu1);
System.out.println("Student的一个对象通过JSONObject.toJSONString转换成字符串格式"+stuToJsonStr2); String stuToJsonStr3 = JSONArray.toJSONString(stu1);
System.out.println("Student的一个对象通过JSONArray.toJSONString转换成字符串格式"+stuToJsonStr3);

2.将java对象序列化为一个Json对象

// 将javaBean转换成Json对象,生成的对象,其中字段顺序并不与Javabean字段相同
//有一个Student对象stu1
//Student对象直接输出为Student [id=20180306, name=Claire, age=18, gender=girl]
Object obj1 = JSONObject.toJSON(stu1);
if (obj1 instanceof JSON) {
System.out.println("student对象(id,name,age,gender)通过JSONObject.toJSON转换成json对象,是无序的"+obj1);
} Object obj2 = JSON.toJSON(stu1);
if (obj1 instanceof JSON) {
System.out.println("student对象(id,name,age,gender)通过JSON.toJSON转换成json对象,是无序的"+obj2);
} Object obj3 = JSONArray.toJSON(stu1);
if (obj1 instanceof JSON) {
System.out.println("student对象(id,name,age,gender)通过JSONArray.toJSON转换成json对象,是无序的"+obj3);
}

3.将Json对象写到某文件中

// 把序列化之后的json对象写到指定文件中
//文件显示为{"gender":"girl","name":"Claire","id":20180306,"age":18}
JSON.writeJSONString(new FileWriter("C:\\your\\file\\path\\fileName.txt"), obj3);

4.将JSON字符串转换成JSON对象

// 把json字符串转换成json对象
String jsonString = "{\"age\":18,\"gender\":\"girl\",\"id\":20180306,\"name\":\"Claire\"}";
Object obj4 = JSONArray.parse(jsonString);
System.out.println("用JSONArray.parse将json字符串转化为json对象" + obj4); //System.out.println(JSONArray.parseArray(jsonString));这里会报错的,因为这个方法只能转换带【】的
System.out.println(JSONObject.parseObject(jsonString));

5.将JSON对象转换成Java对象、JSON字符串转换成java对象

    // json对象转换成javaBean
//下面是将JSON对象转换成student对象,如果将前面的json对象换成JSON字符串,就是将json字符串转换成student对象了
Student stu2 = JSON.toJavaObject((JSON) obj4, Student.class);
System.out.println("用JSON.toJavaObject将Jason对象转换成java对象" + stu2); System.out.println(
"用JSONArray.toJavaObject将Jason对象转换成java对象" + JSONArray.toJavaObject((JSON) obj4, Student.class));
System.out.println(
"用JSONObject.toJavaObject将Jason对象转换成java对象" + JSONObject.toJavaObject((JSON) obj4, Student.class));

6.对象数组转换成json对象

// 对象数组转换成json对象
Student stuobj1 = new Student(10001, "leafly", 19, "xinjiboy");
Student stuobj2 = new Student(10002, "Claire", 19, "beauifyGirl"); Student[] stuArry = { stuobj1, stuobj2 }; String jsonObjStr = JSONObject.toJSONString(stuArry);
System.out.println("对象数组转换成json字符串" + jsonObjStr);// [{"age":19,"gender":"xinjiboy","id":10001,"name":"leafly"},{"age":19,"gender":"beauifyGirl","id":10002,"name":"Claire"}] String jString = JSON.toJSONString(stu1);
System.out.println("单个对象转换成json字符串" + jString);//单个对象转换成json字符串{"age":18,"gender":"girl","id":20180306,"name":"Claire"}

介绍下JSONObject:

其底层是Map<String, Object>。所以,可以通过下面方式来遍历我们JSONObject中的所有元素

// jsonObject的结构解析,底层是map
Object jsonObject2 = JSON.toJSON(stu1);
JSONObject jsonobj = (JSONObject) jsonObject2;
Map<String, Object> map = jsonobj.getInnerMap();
Set<String> mapKeys = map.keySet();
for (String mapKey : mapKeys) {
System.out.println("getInnerMap的方法来遍历" + mapKey + "---" + map.get(mapKey));
} // 第二种遍历方法,entrySet是保存了map(即:jsonObject)的set集合
// public Set<Map.Entry<String, Object>> entrySet() {}
Iterator<Entry<String, Object>> it = jsonobj.entrySet().iterator();
while (it.hasNext()) {
Entry<String, Object> entry = it.next();
System.out.println("entrySet的方法2来遍历" + entry.getKey() + "----" + entry.getValue());
}

介绍下JSONArray:

其底层是个list,可以通过下面方式来遍历元素

        // jsonArray的结构解析,底层是ArrayList
// JSONArray jsonArray =(JSONArray)JSONArray.toJSON(stu1);
String jsonObjectStr1 = "[{'aa':'claire'},{'bb':'leaf'},{'cc':'黎明'},{'dd':'郭富城'}]";
//JSONArray.ParseArray只能解析[]这种类型的([{'aa':'claire'},{'bb':'leaf'},{'cc':'黎明'},{'dd':'郭富城'}])
JSONArray jsonArray = JSONArray.parseArray(jsonObjectStr1); Iterator<Object> it2 = jsonArray.iterator();
for (Object object : jsonArray) {
System.out.println("遍历jsonArray" + object);
}

除了上述基本语法之外,我们还经常会遇到一个问题:对象A中的某个字段aa,并不想序列化它。此时,有5种解决方式。大家可以了解下:

package com.claire.jing;

import java.util.ArrayList;
import java.util.List; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.PropertyFilter;
import com.alibaba.fastjson.serializer.SerializeFilter;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter; public class TestPropertyFilter {
//第三种设置个别字段不参数化的方式:创建一个fastJson的拦截器
public static void main(String[] args) {
PropertyFilter filter = new PropertyFilter() { public boolean apply(Object object, String name, Object value) {
//拦截掉gender 字段
if (name.equals("gender")) {
return false;
}else {
return true;
} }
};
//创建pet对象
Pet pet =new Pet(10001, "cat-mimi", "boy");
//将pet对象转换成JSON字符串,输出结果为{"id":10001,"name":"cat-mimi"}
String jsonString = JSON.toJSONString(pet,filter);
// System.out.println(jsonString); //第四种设置个别字段不参数化的方式(想要哪些字段参数化,将其列出来)
SimplePropertyPreFilter simpleFilter =new SimplePropertyPreFilter(Pet.class, "id","gender");
//将pet对象转换成JSON字符串,输出结果为:{"gender":"boy","id":10001}
//System.out.println(JSONArray.toJSONString(pet, simpleFilter)); //第五种设置个别字段不参数化的方式,深层次过滤
//当一个类A中含有其他类B的引用时,如果要参数化过滤某字段时,就需要深层次过滤(其实就是过滤A又过滤B)
//先创建2个Pet
Pet cat = new Pet(100001, "cat-mimi2", "boy");
Pet dog = new Pet(100002, "dog-wangwang", "girl");
List<Pet> petList = new ArrayList<Pet>();
petList.add(cat);
petList.add(dog); //创建一个PetOwner
PetOwner owner = new PetOwner(20001, petList);
String petOwnerJsonStr1 = JSON.toJSONString(owner);
System.out.println(petOwnerJsonStr1); SimplePropertyPreFilter simpleFilter1 = new SimplePropertyPreFilter(PetOwner.class,"id","ownPets");
SimplePropertyPreFilter simpleFilter2 = new SimplePropertyPreFilter(Pet.class,"name","gender");
//创建一个SerializeFilter的数组,因为后面转换的时候,想要传入多个SimplePropertyPreFilter必须将其组织成数组
SerializeFilter[] filters = {simpleFilter1,simpleFilter2}; //将PetOwner对象转换成Json字符串
String petOwnerJsonStr = JSON.toJSONString(owner, filters);
System.out.println(petOwnerJsonStr); } } class PetOwner{
int id;
List<Pet> ownPets;
//
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Pet> getOwnPets() {
return ownPets;
}
public void setOwnPets(List<Pet> ownPets) {
this.ownPets = ownPets;
} //
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
for (Pet pet : ownPets) {
buffer.append("PetOwner [id=" + id + ", pet=" + pet + "]") ;
}
return buffer.toString(); } //
public PetOwner(int id, List<Pet> ownPets) {
super();
this.id = id;
this.ownPets = ownPets;
} public PetOwner() { } } class Pet{
private int id;
private String name;
private String gender;
//第一种防止字段序列化的方法:加上transient字段
private transient String kind; //第二种防止字段序列化的方法:注解
@JSONField(serialize=false)
private String length; //getter setter
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
} //
public Pet(int id, String name, String gender) {
super();
this.id = id;
this.name = name;
this.gender = gender;
} public Pet() { } //
@Override
public String toString() {
return "Pet [id=" + id + ", name=" + name + ", gender=" + gender + "]";
} }

有时需要将我们的配置文件读成JSON对象,下面是实现方法:

package com.claire.jing;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; import javax.sound.midi.Soundbank; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; public class ReadJsonProToJsonObj {
public static void main(String[] args) throws IOException, InterruptedException {
//创建流怼到配置文件上
BufferedReader reader = new BufferedReader(new FileReader("C:\\your\\file\\path\\fileName.txt")); //一行一行读取配置文件,
StringBuffer buffer = new StringBuffer(1024*10);
String temp =null;
while ((temp = reader.readLine()) != null ) {
buffer.append(temp);
} String proStr = buffer.toString();
reader.close(); String[] jsonStrs = proStr.split(";"); for (String jsonStr : jsonStrs) {
jsonStr.trim();
if (jsonStr.startsWith("[")&&jsonStr.endsWith("]")) {
JSONArray array = JSONArray.parseArray(jsonStr);
System.out.println(array);
//转换成JSON对象的时候,是需要时间的,如果这个还没转化完就去转换别的了,就会报错。这里给他10S钟去转换,时间足够了。
Thread.sleep(10000);
}
else if (jsonStr.startsWith("{") && jsonStr.endsWith("}")) {
Object obj2 = JSON.parse(jsonStr);
System.out.println(obj2);
Thread.sleep(10000);
} } } }

特别注意:需要序列化类A的对象,那么类A中必须要Getter setter方法,必须有无参构造函数。不然就序列化不出来啦!!

序列化---fastjson使用的更多相关文章

  1. 序列化+fastjson和java各种数据对象相互转化

    序列化的定义 序列化就是一种用来处理对象流的机制 所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是将对象转换为容易传输的格式的过程 例 ...

  2. fastjson自定义序列化竟然有这么多姿势?

    本文介绍下fastjson自定义序列化的各种操作. 一.什么是fastjson? fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSO ...

  3. [转]fastjson常见问题

    转自fastjson wiki说明文档:https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 1. ...

  4. JSON 解析 (一)—— FastJSON的使用

    FastJSON是一个高性能.功能完善的json序列化和解析工具库,可使用Maven添加依赖 <dependency> <groupId>com.alibaba</gro ...

  5. java序列化测试

    0.前言 本文主要对几种常见Java序列化方式进行实现.包括Java原生以流的方法进行的序列化.Json序列化.FastJson序列化.Protobuff序列化. 1.Java原生序列化 Java原生 ...

  6. 75、JSON 解析库---FastJson, Gson

    JSON 的简介: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.用于数据转换传输, 通用于PHP,Java,C++,C#,Python等编程语言数据交 ...

  7. alibaba fastjson常见问题FAQ

    English | 中文 1. 怎么获得fastjson? 你可以通过如下地方下载fastjson: maven中央仓库: http://central.maven.org/maven2/com/al ...

  8. 【转】几种Java序列化方式的实现

    0.前言 本文主要对几种常见Java序列化方式进行实现.包括Java原生以流的方法进行的序列化.Json序列化.FastJson序列化.Protobuff序列化. 1.Java原生序列化 Java原生 ...

  9. Jackson替换fastjson

    为什么要替换fastjson 工程里大量使用了fastjson作为序列化和反序列化框架,甚至ORM在处理部分字段也依赖fastjson进行序列化和反序列化.那么作为大量使用的基础框架,为什么还要进行替 ...

随机推荐

  1. linux ps -aux各列含义

    常用ps -aux命令来查看进程情况,但对各列含义还有点模糊,查一下以备后用 # ps aux | moreUSER       PID  %CPU   %MEM   VSZ    RSS    TT ...

  2. HDU1069 Monkey and Banana

    HDU1069 Monkey and Banana 题目大意 给定 n 种盒子, 每种盒子无限多个, 需要叠起来, 在上面的盒子的长和宽必须严格小于下面盒子的长和宽, 求最高的高度. 思路 对于每个方 ...

  3. js两个浮点数相减出现多位小数的bug

  4. OGG抽取进程异常问题排查一例

    1.问题现象抽取进程常常running,但是没有新产生trail文件,lag比较大 GGSCI (xxxdb) > info all Program Status Group Lag at Ch ...

  5. SQL里的concat() 以及group_concat() 函数的使用

    实例参考:https://blog.csdn.net/mary19920410/article/details/76545053 一 concat()函数 1.功能:将多个字符串连接成一个字符串. 2 ...

  6. Object C学习笔记23-继承,重写,重载(转)

    前面的学习都一直在使用Object C对象,但是没有具体总结过Object C中的对象使用特性,这里简单总结一下. 一.  继承 在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在 ...

  7. Struts2知识点小结(四)--拦截器与注解开发

    一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件 1.str ...

  8. Angularjs基础(七)

    AngularJS表单 AngularJS表单时输入控件的集合HTML控件 一下HTML input 元素被称为HTML 控件: input 元素 select元素 button元素 textarea ...

  9. Angularjs基础(四)

    AngularJS过滤器 过滤器可以使用一个管道符(|)添加到表达式和指令中. AngularJS过滤器可用于转换数据: currency 格式化数字为货币格式 filter 从数组中选着应子集. l ...

  10. WebGL学习笔记(2)

    根据上一篇学习笔记,理解WebGL的工作原理及基本调用代码后,可以开始研究3D顶点对象的缩放.旋转.以及对对象进行可交互(鼠标或键盘控制)的旋转或者缩放. 要理解对象的旋转/缩放需要首先学习矩阵的计算 ...