使用Jackson来实现Java对象与JSON的相互转换的教程
一、入门
Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。
1.JAVA对象转JSON[JSON序列化]
importjava.io.IOException;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importcom.fasterxml.jackson.databind.ObjectMapper;
publicclassJacksonDemo{
publicstaticvoidmain(String[]args)throwsParseException,IOException{
Useruser=newUser();
user.setName("小民");
user.setEmail("xiaomin@sina.com");
user.setAge(20);
SimpleDateFormatdateformat=newSimpleDateFormat("yyyy-MM-dd");
user.setBirthday(dateformat.parse("1996-10-01"));
/**
*ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中实现。
*ObjectMapper有多个JSON序列化的方法,可以把JSON字符串保存File、OutputStream等不同的介质中。
*writeValue(Filearg0,Objectarg1)把arg1转成json序列,并保存到arg0文件中。
*writeValue(OutputStreamarg0,Objectarg1)把arg1转成json序列,并保存到arg0输出流中。
*writeValueAsBytes(Objectarg0)把arg0转成json序列,并把结果输出成字节数组。
*writeValueAsString(Objectarg0)把arg0转成json序列,并把结果输出成字符串。
*/
ObjectMappermapper=newObjectMapper();
//User类转JSON
//输出结果:{"name":"小民","age":20,"birthday":844099200000,"email":"xiaomin@sina.com"}
Stringjson=mapper.writeValueAsString(user);
System.out.println(json);
//Java集合转JSON
//输出结果:[{"name":"小民","age":20,"birthday":844099200000,"email":"xiaomin@sina.com"}]
List<User>users=newArrayList<User>();
users.add(user);
Stringjsonlist=mapper.writeValueAsString(users);
System.out.println(jsonlist);
}
}
2.JSON转Java类[JSON反序列化]
importjava.io.IOException;
importjava.text.ParseException;
importcom.fasterxml.jackson.databind.ObjectMapper;
publicclassJacksonDemo{
publicstaticvoidmain(String[]args)throwsParseException,IOException{
Stringjson="{\"name\":\"小民\",\"age\":20,\"birthday\":844099200000,\"email\":\"xiaomin@sina.com\"}";
/**
*ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
*/
ObjectMappermapper=newObjectMapper();
Useruser=mapper.readValue(json,User.class);
System.out.println(user);
}
}
二、Jackson支持3种使用方式:
1、DataBinding:最方便使用.
(1)FullDataBinding:
privatestaticfinalStringMODEL_BINDING="{\"name\":\"name1\",\"type\":1}";
publicvoidfullDataBinding()throwsException{
ObjectMappermapper=newObjectMapper();
Modeluser=mapper.readValue(MODEL_BINDING,Model.class);//readValue到一个实体类中.
System.out.println(user.getName());
System.out.println(user.getType());
}
Model类:
privatestaticclassModel{
privateStringname;
privateinttype;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetType(){
returntype;
}
publicvoidsetType(inttype){
this.type=type;
}
}
(2)RawDataBinding:
/**
ConcreteJavatypesthatJacksonwilluseforsimpledatabindingare:
JSONTypeJavaType
objectLinkedHashMap<String,Object>
arrayArrayList<Object>
stringString
number(nofraction)Integer,LongorBigInteger(smallestapplicable)
number(fraction)Double(configurabletouseBigDecimal)
true|falseBoolean
nullnull
*/
publicvoidrawDataBinding()throwsException{
ObjectMappermapper=newObjectMapper();
HashMapmap=mapper.readValue(MODEL_BINDING,HashMap.class);//readValue到一个原始数据类型.
System.out.println(map.get("name"));
System.out.println(map.get("type"));
}
(3)genericDataBinding:
privatestaticfinalStringGENERIC_BINDING="{\"key1\":{\"name\":\"name2\",\"type\":2},\"key2\":{\"name\":\"name3\",\"type\":3}}";
publicvoidgenericDataBinding()throwsException{
ObjectMappermapper=newObjectMapper();
HashMap<String,Model>modelMap=mapper.readValue(GENERIC_BINDING,newTypeReference<HashMap<String,Model>>(){});//readValue到一个范型数据中.
Modelmodel=modelMap.get("key2");
System.out.println(model.getName());
System.out.println(model.getType());
}
2、TreeModel:最灵活。
privatestaticfinalStringTREE_MODEL_BINDING="{\"treekey1\":\"treevalue1\",\"treekey2\":\"treevalue2\",\"children\":[{\"childkey1\":\"childkey1\"}]}";
publicvoidtreeModelBinding()throwsException{
ObjectMappermapper=newObjectMapper();
JsonNoderootNode=mapper.readTree(TREE_MODEL_BINDING);
//path与get作用相同,但是当找不到该节点的时候,返回missingnode而不是Null.
Stringtreekey2value=rootNode.path("treekey2").getTextValue();//
System.out.println("treekey2value:"+treekey2value);
JsonNodechildrenNode=rootNode.path("children");
Stringchildkey1Value=childrenNode.get(0).path("childkey1").getTextValue();
System.out.println("childkey1Value:"+childkey1Value);
//创建根节点
ObjectNoderoot=mapper.createObjectNode();
//创建子节点1
ObjectNodenode1=mapper.createObjectNode();
node1.put("nodekey1",1);
node1.put("nodekey2",2);
//绑定子节点1
root.put("child",node1);
//数组节点
ArrayNodearrayNode=mapper.createArrayNode();
arrayNode.add(node1);
arrayNode.add(1);
//绑定数组节点
root.put("arraynode",arrayNode);
//JSON读到树节点
JsonNodevalueToTreeNode=mapper.valueToTree(TREE_MODEL_BINDING);
//绑定JSON节点
root.put("valuetotreenode",valueToTreeNode);
//JSON绑定到JSON节点对象
JsonNodebindJsonNode=mapper.readValue(GENERIC_BINDING,JsonNode.class);//绑定JSON到JSON节点对象.
//绑定JSON节点
root.put("bindJsonNode",bindJsonNode);
System.out.println(mapper.writeValueAsString(root));
}
3、StreamingAPI:最佳性能。
对于性能要求高的程序,推荐使用流API,否则使用其他方法
不管是创建JsonGenerator还是JsonParser,都是使用JsonFactory。
packagecom.jingshou.jackson;
importjava.io.File;
importjava.io.IOException;
importcom.fasterxml.jackson.core.JsonEncoding;
importcom.fasterxml.jackson.core.JsonFactory;
importcom.fasterxml.jackson.core.JsonGenerator;
importcom.fasterxml.jackson.core.JsonParser;
importcom.fasterxml.jackson.core.JsonToken;
publicclassJacksonTest6{
publicstaticvoidmain(String[]args)throwsIOException{
JsonFactoryjfactory=newJsonFactory();
/***writetofile***/
JsonGeneratorjGenerator=jfactory.createGenerator(newFile(
"c:\\user.json"),JsonEncoding.UTF8);
jGenerator.writeStartObject();//{
jGenerator.writeStringField("name","mkyong");//"name":"mkyong"
jGenerator.writeNumberField("age",29);//"age":29
jGenerator.writeFieldName("messages");//"messages":
jGenerator.writeStartArray();//[
jGenerator.writeString("msg1");//"msg1"
jGenerator.writeString("msg2");//"msg2"
jGenerator.writeString("msg3");//"msg3"
jGenerator.writeEndArray();//]
jGenerator.writeEndObject();//}
jGenerator.close();
/***readfromfile***/
JsonParserjParser=jfactory.createParser(newFile("c:\\user.json"));
//loopuntiltokenequalto"}"
while(jParser.nextToken()!=JsonToken.END_OBJECT){
Stringfieldname=jParser.getCurrentName();
if("name".equals(fieldname)){
//currenttokenis"name",
//movetonext,whichis"name"'svalue
jParser.nextToken();
System.out.println(jParser.getText());//displaymkyong
}
if("age".equals(fieldname)){
//currenttokenis"age",
//movetonext,whichis"name"'svalue
jParser.nextToken();
System.out.println(jParser.getIntValue());//display29
}
if("messages".equals(fieldname)){
jParser.nextToken();//currenttokenis"[",movenext
//messagesisarray,loopuntiltokenequalto"]"
while(jParser.nextToken()!=JsonToken.END_ARRAY){
//displaymsg1,msg2,msg3
System.out.println(jParser.getText());
}
}
}
jParser.close();
}
}