FastJson:JSON JSONObject JSONArray詳解以及SimplePropertyPreFilter 的介紹
FastJson是阿里巴巴開發的一款專門用于Java開發的包,實現Json對象,JavaBean對,Json字符串之間的轉換。
文章目錄
- FastJson:JSON JSONObject JSONArray詳解以及SimplePropertyPreFilter 的介紹
- 一、JSON對象介紹
- 二、FastJson-JSON
- 三、FastJson-JSONObject
- 四、FastJson-JSONArray
- 五、常用方法匯總
- 常用方法
- 簡單說一下FastJSON的JSON過濾器
一、JSON對象介紹
JSON的特點如下:
- 數據在花括號中。
- 數據以"鍵:值"對的形式出現(其中鍵多以字符串形式出現,值可取字符串,數值,甚至其他json對象)。
- 每兩個"鍵:值"對以逗號分隔(最后一個"鍵:值"對省略逗號)。
例:
普通Json對象
{"ID": 1001,"name": "張三","age": 24
?}
數組Json對象
[{"ID": 1001, "name": "張三", "age": 24},{"ID": 1002, "name": "李四", "age": 25},{"ID": 1003, "name": "王五", "age": 22}
]復雜Json對象
{"部門名稱":"研發部","部門成員":[{"ID": 1001, "name": "張三", "age": 24},{"ID": 1002, "name": "李四", "age": 25},{"ID": 1003, "name": "王五", "age": 22}],"部門位置":"xx樓21號"
}
二、FastJson-JSON
JSON是一個抽象類并且實現了JSONStreamAware, JSONAware接口,提供了JSON轉換的方法(詳細方法說明看后文)。
JSON多用于JavaBean->JSONString 或者 JSONString->javaJSON
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity {@JSONField(name = "student_name",ordinal = 1)private String name;@JSONField(name = "student_age",ordinal = 2)private Integer age;
}
@Testpublic void beanJsonTest() {StudentEntity student = StudentEntity.builder().name("張三").age(18).build();String jsonStudentString = JSON.toJSONString(student); //{"student_name":"張三","student_age":18}StudentEntity studentObject = JSON.parseObject(jsonStudentString, StudentEntity.class); //轉為java對象}
三、FastJson-JSONObject
JSONObject繼承了JSON并實現了Map接口。
底層是個Map集合,多用于操作JSONObject 如取屬性等,Map集合的功能也都有。
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity {@JSONField(name = "student_name",ordinal = 1)private String name;@JSONField(name = "student_age",ordinal = 2)private Integer age;
}
@Testpublic void beanJsonTest() {StudentEntity student = StudentEntity.builder().name("張三").age(18).build();String jsonStudentString = JSON.toJSONString(student); //{"student_name":"張三","student_age":18}/**Map<String,Object> map = new HashMap<>();map.put("student_name", "李四");map.put("student_age", 19);map.put("date",students);JSONObject jsonObject = new JSONObject(map);**/JSONObject jsonObject = JSONObject.parseObject(jsonStudentString); //{"student_name":"張三","student_age":18}jsonObject.put("student_name", "李四");jsonObject.put("student_age", 19);//{"student_name":"李四","student_age":19}jsonObject.put("date",student);//{"student_name":"張三","student_age":18,"date":[{"student_name":"張三","student_age":18},{"student_name":"張三","student_age":18},{"student_name":"張三","student_age":18}]}//get方法 根據key取出valueStudentEntity date = jsonObject.getObject("date", StudentEntity.class);String studentName = jsonObject.getObject("student_name", String.class);jsonObject.getString("student_name");}
四、FastJson-JSONArray
JSONObject繼承了JSON并實現了List接口。
底層是個ArrayList,多用于用于操作JSONArray 比如遍歷等,通常與JSONObject聯合使用。
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity {@JSONField(name = "student_name",ordinal = 1)private String name;@JSONField(name = "student_age",ordinal = 2)private Integer age;
}
@Testpublic void twoTest3() {StudentEntity student1 = StudentEntity.builder().name("張三").age(18).build();StudentEntity student2 = StudentEntity.builder().name("張三").age(18).build();StudentEntity student3 = StudentEntity.builder().name("張三").age(18).build();ArrayList<StudentEntity> students = Lists.newArrayList(student1, student2, student3);JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(students));jsonArray.forEach(item -> {String jsonStudentStringItem = JSONObject.toJSONString(item);System.out.println(jsonStudentStringItem);});//{"student_name":"張三","student_age":18}//{"student_name":"張三","student_age":18}//{"student_name":"張三","student_age":18}JSONObject StudentJson = new JSONObject();StudentJson.put("Student",jsonArray);System.out.println(StudentJson.toJSONString());}
五、常用方法匯總
常用方法
/*** FastJson常用方法*/@Testpublic void fastJSONTest() {StudentEntity student = StudentEntity.builder().name("張三").age(18).build();//1.JSON常用方法//1.1 toJSONString :將java對象轉為JSONStringString jsonStudentString = JSON.toJSONString(student);//{"student_name":"張三","student_age":18}//1.2 parseObject :將JSONString轉為java對象StudentEntity studentObject = JSON.parseObject(jsonStudentString, StudentEntity.class);//StudentEntity(name=張三, age=18)// 1.3 JSONtoJSONBytes():將 Java 對象序列化為 JSON 字節數組byte[] jsonStudentStringBytes = JSON.toJSONBytes(student);//[123, 34, 115, 116, 117, 100, 101, 110, 116, 95, 110, 97, 109, 101, 34, 58, 34, 228, 189, 254, 228, 184, 230, 34, 44, 34,115, 116, 117, 100, 101, ]//1.4 JSONparseBytes():將 JSON 字節數組反序列化為 Java 對象StudentEntity studentObject2 = JSON.parseObject(jsonStudentStringBytes, StudentEntity.class);//1.5 JSON.parseObject:將Java對象轉為JSONObjectJSONObject jsonObject = JSON.parseObject(jsonStudentString);//2.JSONObject常用方法 JSONObject繼承了JSON類,并實現了Map接口,所以可以調用JSON類中的方法,并且重寫了Map相關方法//2.1 JSONObject.toJSONString():將JSONObject轉為JSONStringString jsonStudentString2 = jsonObject.toJSONString();//{"student_name":"張三","student_age":18}//2.2 JSONObject.put():根據key設置valuejsonObject.put("STUDENT", StudentEntity.builder().name("王五").age(22).build());//{"student_name":"張三","student_age":18,"STUDENT":{"student_name":"王五","student_age":22}}//2.3 JSONObject.getXxx():根據key取出valueString studentName = jsonObject.getString("student_name");//張三Integer studentAge = jsonObject.getInteger("student_age");//18/* String name = jsonObject.getObject("name", String.class);Integer age = jsonObject.getObject("age", Integer.class);*/StudentEntity studentObject3 = jsonObject.getObject("STUDENT", StudentEntity.class);//StudentEntity(name=王五, age=22)//2.4 toJavaObject:將JSONObject轉為Java對象StudentEntity javaObject = jsonObject.toJavaObject(StudentEntity.class);//2.5 putAll():合并兩個JSONObjectString json1 = "{\"name\":\"Jack\"}";String json2 = "{\"age\":35}";JSONObject jsonObject1 = JSON.parseObject(json1);JSONObject jsonObject2 = JSON.parseObject(json2);JSONObject jsonObject3 = new JSONObject();jsonObject3.putAll(jsonObject1);jsonObject3.putAll(jsonObject2);//{"name":"Jack","age":35}//2.6 isEmpty():判斷JSONObject是否為空boolean empty = jsonObject.isEmpty();//containsKey() keySet() vlues() clear() remove() containsValue() 跟Map集合的方法一樣 不在列舉//3.JSONArray常用方法//3.1. parseArray:將Java對象轉為JSONArrayStudentEntity student1 = StudentEntity.builder().name("張三1").age(18).build();StudentEntity student2 = StudentEntity.builder().name("張三2").age(18).build();StudentEntity student3 = StudentEntity.builder().name("張三3").age(18).build();ArrayList<StudentEntity> studentEntities = Lists.newArrayList(student1, student2, student3);JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(studentEntities));//[{"student_name":"張三1","student_age":18},{"student_name":"張三2","student_age":18},{"student_name":"張三3","student_age":18}]//3.2. toJSONString():將JSONArray轉為JSONStringString jsonArrayString = jsonArray.toJSONString();//"[{"student_name":"張三1","student_age":18},{"student_name":"張三2","student_age":18},{"student_name":"張三3","student_age":18}]//3.3. toJavaObject():將JSONArray轉為Java對象List<StudentEntity> studentEntities1 = jsonArray.toJavaList(StudentEntity.class);// forEach(),fparallelStream(),stream(),spliterator(),iterator(),sort(),get()這些Arraylist方法同樣都有,不在列舉}
簡單說一下FastJSON的JSON過濾器
SimplePropertyPreFilter 簡單過濾器
class Person {public String name;public int age;
}
@Testpublic void toJSONStringWithFilterExample() {Person person = new Person();person.name = "Eve";person.age = 40;// SimplePropertyPreFilter類 實現 JSON字符串過濾SimplePropertyPreFilter simplePropertyPreFilter1 = new SimplePropertyPreFilter();//添加過濾字段simplePropertyPreFilter1.getExcludes().add("age");//不包括 "age" 字段//調用toJSONString將Java轉String時傳入過濾器System.out.println(JSON.toJSONString(person, simplePropertyPreFilter1));//{"name":"Eve"}//或者SimplePropertyPreFilter simplePropertyPreFilter2 = new SimplePropertyPreFilter();//添加保留字段simplePropertyPreFilter2.getIncludes().add("name");//包括 "name" 字段//調用toJSONString將Java轉String時傳入過濾器System.out.println(JSON.toJSONString(person, simplePropertyPreFilter2));//{"name":"Eve"}
}
自定義過濾器
FastJson提供的簡單過濾器很多時候無法滿足我們需求,這個時候就可以自定義管理器
@Testpublic void toJSONStringWithFilterExample2() {Person person = new Person();//1.實現 ValueFilter 接口 重寫 process 方法ValueFilter filter = (object, name, value) -> {if (name.equals("age")) {return null; // 不包括 "age" 字段}return value;};// 2.實現 PropertyFilter 接口 重寫 apply 方法PropertyFilter filter2 = (object, name, value) -> {if (name.equals("age")) {return false; // 不包括 "age" 字段}return true;};String jsonString1 = JSON.toJSONString(person, filter);//{"name":"Eve"}String jsonString2 = JSON.toJSONString(person, filter2);//{"name":"Eve"}}
當然還可以根據管理器實現原來去手搓來增填功能,深入了解推薦一篇文章
API接口使用Jackson序列化JSON數據動態過濾字段