目录
1. Java版
1.1 序列化
1.1.1 序列化一个普通对象
存在空值时,有两种处理方法。
// 正常对象
User u = new User();
u.setName("王五");
u.setAge(30);
System.out.println(JSON.toJSONString(u));
// 输出结果 {"age":30,"name":"王五"}
// 存在空值的对象
User u1 = new User();
u1.setAge(30);
System.out.println(JSON.toJSONString(u1,SerializerFeature.WriteMapNullValue));
// 输出null,输出结果 {"age":30,"name":null}
System.out.println(JSON.toJSONString(u1,SerializerFeature.WriteNullStringAsEmpty));
// 输出"",输出结果 {"age":30,"name":""}
1.1.2 序列化和反序列化日期
Date date = new Date();
String dateString = JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss");
System.out.println(dateString);
// 输出结果 "2018-08-03 09:44:21"
String dateString1 = "{\"time\":\"2018-08-01 22:22:22\"}";
System.out.println(JSON.parseObject(dateString1));
// 输出结果 {"time":"2018-08-01 22:22:22"}
1.2 反序列化
反序列化一个复杂的JSON字符串。得到一个成员变量包括 string int Object List<Object> 等多种类型的复杂类的对象。
下面是类的声明:
// 课程类
public class Course {
private String courseName;
private String code;
public Course (String courseName, String code){
this.setCourseName(courseName);
this.setCode(code);
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
// 学生类
public class Student {
private int id;
private String studentName;
private int age;
public Student(int id, String studentName, int age) {
this.setId(id);
this.setStudentName(studentName);
this.setAge(age);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 将要序列化的 老师类
// 成员变量包括 string int Object List<Object> 等多种类型。
public class Teacher {
private String teacherName;
private int age;
private Course course;
private List<Student> students;
public Teacher(String teacherName, int age, Course course, List<Student> students) {
this.setTeacherName(teacherName);
this.setAge(age);
this.setCourse(course);
this.setStudents(students);
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
反序列化结果:
String complexJsonString = "{\"teacherName\":\"crystall\",\"age\":27,\"course\":{\"courseName\":\"english\",\"code\":1270},\"students\":[{\"id\":1,\"studentName\":\"lily\",\"age\":12},{\"id\":2,\"studentName\":\"lucy\",\"age\":15}]}";
Teacher teacher = JSON.parseObject(complexJsonString,Teacher.class);
1.3 一些其他常用函数
String jsonString1 = "{\"name\":\"张三\",\"age\":50}";
JSONObject jsonObject = JSON.parseObject(jsonString1);
System.out.println(jsonObject.keySet()); // 输出key集合,输出结果 [name, age]
if(jsonObject.containsKey("sex")) { // 判断key是否存在,输出结果 false
System.out.println(true);
} else {
System.out.println(false);
}
jsonObject.put("sex","man"); // 添加k/v键值对,输出结果 {"sex":"man","name":"张三","age":50}
System.out.println(jsonObject);
if (jsonObject.containsValue("man")) { // 判断value是否存在,输出结果 false
System.out.println(true);
} else {
System.out.println(false);
}
String jsonArrayString1 = "[{\"id\":1,\"studentName\":\"lily\",\"age\":12},{\"id\":2,\"studentName\":\"lucy\",\"age\":15}]";
JSONArray jsonArray = JSON.parseArray(jsonArrayString1);
for (int i = 0; i < jsonArray.size(); i++) { // 遍历输出
JSONObject jsonObj= jsonArray.getJSONObject(i);
System.out.println(jsonObj.get("id"));
}
Student s3 = new Student(3,"学生乙",15);
jsonArray.add(s3); // 添加新jsonobject对象,输出结果 3
System.out.println(jsonArray.size());
if(jsonArray.contains(s3)) { // 判断是否存在,输出结果 true
System.out.println(true);
} else {
System.out.println(false);
}
2. Scala版
2.1 序列化
val arr = Seq("tom:10", "bob:14", "hurry:9")
val dataRdd = spark.sparkContext.parallelize(arr)
val dataString = dataRdd.map(x => {
val arr = x.split(":")
val name = arr(0)
val age = arr(1).toInt
val u = new User(name,age)
u
}).map(x => {
JSON.toJSONString(x,SerializerFeature.WriteMapNullValue) // 这里需要显示SerializerFeature中的某一个,否则会报同时匹配两个方法的错误
})
dataString.foreach(println)
// 输出结果
{"age":10,"name":"tom"}
{"age":14,"name":"bob"}
{"age":9,"name":"hurry"}
2.2 反序列化
...待续...