解析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]