解析Java的Jackson库中对象的序列化与数据泛型绑定
Jackson对象序列化
这里将介绍将Java对象序列化到一个JSON文件,然后再读取JSON文件获取转换为对象。在这个例子中,创建了Student类。创建将有学生对象以JSON表示在一个student.json文件。
创建一个名为JacksonTester在Java类文件在C:\>Jackson_WORKSPACE.
文件:JacksonTester.java
importjava.io.File;
importjava.io.IOException;
importorg.codehaus.jackson.JsonGenerationException;
importorg.codehaus.jackson.JsonParseException;
importorg.codehaus.jackson.map.JsonMappingException;
importorg.codehaus.jackson.map.ObjectMapper;
publicclassJacksonTester{
publicstaticvoidmain(Stringargs[]){
JacksonTestertester=newJacksonTester();
try{
Studentstudent=newStudent();
student.setAge(10);
student.setName("Mahesh");
tester.writeJSON(student);
Studentstudent1=tester.readJSON();
System.out.println(student1);
}catch(JsonParseExceptione){
e.printStackTrace();
}catch(JsonMappingExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
privatevoidwriteJSON(Studentstudent)throwsJsonGenerationException,JsonMappingException,IOException{
ObjectMappermapper=newObjectMapper();
mapper.writeValue(newFile("student.json"),student);
}
privateStudentreadJSON()throwsJsonParseException,JsonMappingException,IOException{
ObjectMappermapper=newObjectMapper();
Studentstudent=mapper.readValue(newFile("student.json"),Student.class);
returnstudent;
}
}
classStudent{
privateStringname;
privateintage;
publicStudent(){}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringtoString(){
return"Student[name:"+name+",age:"+age+"]";
}
}
验证结果
使用javac编译如下类:
C:\Jackson_WORKSPACE>javacJacksonTester.java
现在运行jacksonTester看到的结果:
C:\Jackson_WORKSPACE>javaJacksonTester
验证输出结果
Student[name:Mahesh,age:10]
Jackson数据绑定泛型
在简单的数据绑定中,我们使用String作为关键对象,并作为一个值对象映射类。相反,我们可以使用具体的Java对象和类型强制转换到JSON使用。
考虑下面的例子使用一个类的UserData来保存用户专用数据。
创建一个名为JacksonTester在Java类文件目录C:\>Jackson_WORKSPACE.
文件名:JacksonTester.java
importjava.io.File;
importjava.io.IOException;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importorg.codehaus.jackson.JsonGenerationException;
importorg.codehaus.jackson.JsonParseException;
importorg.codehaus.jackson.map.JsonMappingException;
importorg.codehaus.jackson.map.ObjectMapper;
importorg.codehaus.jackson.type.TypeReference;
publicclassJacksonTester{
publicstaticvoidmain(Stringargs[]){
JacksonTestertester=newJacksonTester();
try{
ObjectMappermapper=newObjectMapper();
MapuserDataMap=newHashMap();
UserDatastudentData=newUserData();
int[]marks={1,2,3};
Studentstudent=newStudent();
student.setAge(10);
student.setName("Mahesh");
//JAVAObject
studentData.setStudent(student);
//JAVAString
studentData.setName("MaheshKumar");
//JAVABoolean
studentData.setVerified(Boolean.FALSE);
//Array
studentData.setMarks(marks);
TypeReferenceref=newTypeReference>(){};
userDataMap.put("studentData1",studentData);
mapper.writeValue(newFile("student.json"),userDataMap);
//{
//"studentData1":
//{
//"student":
//{
//"name":"Mahesh",
//"age":10
//},
//"name":"MaheshKumar",
//"verified":false,
//"marks":[1,2,3]
//}
//}
userDataMap=mapper.readValue(newFile("student.json"),ref);
System.out.println(userDataMap.get("studentData1").getStudent());
System.out.println(userDataMap.get("studentData1").getName());
System.out.println(userDataMap.get("studentData1").getVerified());
System.out.println(Arrays.toString(userDataMap.get("studentData1").getMarks()));
}catch(JsonParseExceptione){
e.printStackTrace();
}catch(JsonMappingExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
classStudent{
privateStringname;
privateintage;
publicStudent(){}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringtoString(){
return"Student[name:"+name+",age:"+age+"]";
}
}
classUserData{
privateStudentstudent;
privateStringname;
privateBooleanverified;
privateint[]marks;
publicUserData(){}
publicStudentgetStudent(){
returnstudent;
}
publicvoidsetStudent(Studentstudent){
this.student=student;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicBooleangetVerified(){
returnverified;
}
publicvoidsetVerified(Booleanverified){
this.verified=verified;
}
publicint[]getMarks(){
returnmarks;
}
publicvoidsetMarks(int[]marks){
this.marks=marks;
}
}
验证输出
使用javac编译如下类:
C:\Jackson_WORKSPACE>javacJacksonTester.java
现在运行jacksonTester看到的结果:
C:\Jackson_WORKSPACE>javaJacksonTester
验证输出
Student[name:Mahesh,age:10] MaheshKumar false [1,2,3]