使用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(); } }