java中如何使用jackson读写json和xml呢?
下文笔者讲述java中使用jackson读写json和xml的方法及示例分享,如下所示
读写json和xml的实现思路
//1.引入相应包 jackson基本包:jackson-core、jackson-databind、jackson-annotations xml功能:jackson-dataformat-xml(jdk9及以上需要引入JAXB包) xml高效类库:woodstox-core jdk8支持:jackson-datatype-jsr310、jackson-module-parameter-names、jackson-datatype-jdk8 //2.使用json中相关ObjectMapper 即可实现对json和xml的读写操作例:jackson读写json和xml的示例
maven引入 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.8</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.9.8</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-parameter-names --> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-parameter-names</artifactId> <version>2.9.8</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jdk8 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jdk8</artifactId> <version>2.9.8</version> </dependency> <!-- https://mvnrepository.com/artifact/org.codehaus.woodstox/stax2-api --> <dependency> <groupId>org.codehaus.woodstox</groupId> <artifactId>stax2-api</artifactId> <version>4.1</version> </dependency> <!-- JAXB start --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.2.11</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.2.11</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <!-- JAXB end --> package com.java265; import java.io.File; import java.io.IOException; import java.time.LocalDate; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRootName; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; public class TestJackson { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { TestJackson testJackson = new TestJackson(); System.out.println("===============pojo,map=================="); testJackson.test1(); System.out.println("=================标签================"); testJackson.test2(); System.out.println("=================树================"); testJackson.test3(); System.out.println("=================流================"); testJackson.test4(); System.out.println("=================jdk8日期================"); testJackson.test5(); System.out.println("=================xml================"); testJackson.test6(); } //pojo,map public void test1() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); Stu stu = new Stu(); stu.setName("雷克斯"); stu.setAge(23); String jsonStr = objectMapper.writeValueAsString(stu); System.out.println(jsonStr); Stu newStu = objectMapper.readValue(jsonStr,Stu.class); System.out.println(newStu); Map<Integer,String> map = new HashMap<>(); map.put(1, "小光"); map.put(2, "小焰"); String jsonmap = objectMapper.writeValueAsString(map); System.out.println(jsonmap); Map<Integer,String> map2 = objectMapper.readValue(jsonmap, new TypeReference<Map<Integer,String>>() {});//指定map类型 System.out.println(map2); } //标签 public void test2() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);//关闭空bean异常(允许序列化空类) // objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);//同上 objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);//启用数字时间戳 // objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);//同上 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);//关闭不识别属性异常 objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);//启用将字符串""转成null // objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);//开启@JsonRootName注解指定的外层rootname Stu2 stu2 = new Stu2(); stu2.setName("林克"); stu2.setAge(22); stu2.setTel("1234567890"); stu2.setAddress("海拉鲁"); stu2.setEmail("linke@xx.xx"); String jsonStr = objectMapper.writeValueAsString(stu2); System.out.println(jsonStr); Stu2 newStu2 = objectMapper.readValue(jsonStr, Stu2.class); System.out.println(newStu2); String otherJson = "{\"StuName\":\"林克\",\"StuAge\":22,\"tel\":\"5432109876\",\"other\":\"abcde\"}"; Stu2 otherStu2 = objectMapper.readValue(otherJson, Stu2.class); System.out.println(otherStu2); } //树 public void test3() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); ObjectNode objNode = objectMapper.createObjectNode(); objNode.put("platform", "switch"); ArrayNode arrayNode = objectMapper.createArrayNode(); arrayNode.add("塞尔达"); arrayNode.add("奥德赛"); objNode.set("name", arrayNode); String jsonStr = objectMapper.writeValueAsString(objNode); System.out.println(jsonStr); String json = "{\"game\":\"宝可梦\",\"names\":[{\"name\":\"皮卡丘\",\"age\":12},{\"name\":\"伊布\",\"age\":11}]}"; ObjectMapper objMapper = new ObjectMapper(); JsonNode rootNode = objMapper.readTree(json); String game = rootNode.path("game").asText(); System.out.println("game>"+game); ArrayNode node = (ArrayNode) rootNode.get("names"); if(node.isArray()) { for(JsonNode n:node) { System.out.println("name>>"+n.path("name")+",age>>"+n.path("age")); } } } //流 public void test4() throws IOException { JsonFactory factory = new JsonFactory(); File f = new File("jackson.json"); JsonGenerator jsonGenerator = factory.createGenerator(f, JsonEncoding.UTF8); //start jsonGenerator.writeStartObject(); //hello jsonGenerator.writeStringField("hello", "Java265"); //array jsonGenerator.writeFieldName("array"); jsonGenerator.writeStartArray(); jsonGenerator.writeString("a"); jsonGenerator.writeString("b"); jsonGenerator.writeString("c"); jsonGenerator.writeEndArray(); //arrayObj jsonGenerator.writeFieldName("arrayObj"); jsonGenerator.writeStartArray(2); jsonGenerator.writeStartObject(); jsonGenerator.writeStringField("aaa", "bbb"); jsonGenerator.writeStringField("XX", "xx"); jsonGenerator.writeEndObject(); jsonGenerator.writeStartObject(); jsonGenerator.writeStringField("ccc", "ddd"); jsonGenerator.writeStringField("YY", "yy"); jsonGenerator.writeEndObject(); jsonGenerator.writeEndArray(); //end jsonGenerator.writeEndObject(); jsonGenerator.close(); //读取json JsonParser jsonParser = factory.createParser(new File("jackson.json")); while(!jsonParser.isClosed()) { JsonToken token = jsonParser.currentToken(); //token的值 // System.out.println(token); // null // START_OBJECT // FIELD_NAME // VALUE_STRING // FIELD_NAME // START_ARRAY // VALUE_STRING // VALUE_STRING // VALUE_STRING // END_ARRAY // FIELD_NAME // START_ARRAY // START_OBJECT // FIELD_NAME // VALUE_STRING // FIELD_NAME // VALUE_STRING // END_OBJECT // START_OBJECT // FIELD_NAME // VALUE_STRING // FIELD_NAME // VALUE_STRING // END_OBJECT // END_ARRAY // END_OBJECT if(JsonToken.FIELD_NAME.equals(token)) { String currentName = jsonParser.currentName(); if("hello".equals(currentName)) { token = jsonParser.nextToken(); System.out.println("hello>"+jsonParser.getValueAsString()); }else if("array".equals(currentName)) { System.out.println("array>"); if(JsonToken.START_ARRAY.equals(jsonParser.nextToken())) { while(JsonToken.VALUE_STRING.equals(jsonParser.nextToken())) { System.out.println(">>"+jsonParser.getValueAsString()); } } }else if("arrayObj".equals(currentName)) { System.out.println("arrayObj>"); if(JsonToken.START_ARRAY.equals(jsonParser.nextToken())) { while(JsonToken.START_OBJECT.equals(jsonParser.nextToken())) { token = jsonParser.nextToken();//FIELD_NAME System.out.print(">>"+jsonParser.getValueAsString()+":"); token = jsonParser.nextToken();//VALUE_STRING System.out.print(jsonParser.getValueAsString()+";"); token = jsonParser.nextToken();//FIELD_NAME System.out.print(jsonParser.getValueAsString()+":"); token = jsonParser.nextToken();//VALUE_STRING System.out.println(jsonParser.getValueAsString()); token = jsonParser.nextToken();//END_OBJECT } } } } jsonParser.nextToken(); } } //jdk8日期支持 public void test5() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); objectMapper.registerModule(new ParameterNamesModule()); objectMapper.registerModule(new Jdk8Module()); // objectMapper.findAndRegisterModules();//自动搜索注册所有模块 Jdk8Date jdk8Date = new Jdk8Date(); jdk8Date.setName("jdk8"); jdk8Date.setDate(LocalDate.of(2019, 1, 16)); String jsonStr = objectMapper.writeValueAsString(jdk8Date); System.out.println("jdk8Date json:"+jsonStr); Jdk8Date date2 = objectMapper.readValue(jsonStr, Jdk8Date.class); System.out.println(date2); } //处理xml public void test6() throws IOException { XmlMapper xmlMapper = new XmlMapper(); xmlMapper.findAndRegisterModules(); xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);//格式化输出 XmlStu xmlStu = new XmlStu(); xmlStu.setName("hello"); xmlStu.setDesc("world"); xmlStu.setAge(12); xmlStu.setSex("boy"); xmlStu.setTel("12345654321"); xmlStu.setBir(LocalDate.of(2019, 1, 16)); String xml = xmlMapper.writeValueAsString(xmlStu); System.out.println(xml); XmlStu xmlstu2 = xmlMapper.readValue(xml, XmlStu.class); System.out.println(xmlstu2); } } class Stu{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name+","+age; } } @JsonRootName("Student") @JsonIgnoreProperties({"tel", "address"}) class Stu2{ @JsonProperty private String other; @JsonProperty("StuName") private String name; @JsonProperty("StuAge") private int age; private String tel; private String address; @JsonIgnore private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return other+"-"+name+">"+age+">"+tel+">"+address+">"+email; } } @JsonRootName("Jdk8Date") class Jdk8Date{ @JsonProperty private String name; @JsonProperty @JsonFormat(pattern = "yyyy年MM月DD日") private LocalDate date; public LocalDate getDate() { return date; } public void setDate(LocalDate date) { this.date = date; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "name="+name+",date="+date; } } @JsonRootName("xmlstu") class XmlStu{ @JacksonXmlProperty private String name; @JacksonXmlProperty @JacksonXmlText//无标签普通文本 private String desc; @JacksonXmlProperty(localName = "Age") private int age; @JacksonXmlProperty(localName = "SEX",isAttribute = true) private String sex; @JacksonXmlProperty @JacksonXmlCData//CDATA标签中 private String tel; @JacksonXmlProperty @JsonFormat(pattern = "yyyy.MM.DD") private LocalDate bir; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public LocalDate getBir() { return bir; } public void setBir(LocalDate bir) { this.bir = bir; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "name="+name+",desc="+desc+",age="+age+",sex="+sex+",tel="+tel+",bir="+bir; } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。