JSON解析-Jackson
JSON解析-Jackson
1.Jackson简介
参考链接:link
简介:Jackson是一个简洁的方式去解析JSON开源包。Jackson可以解析JSON从String,Stream,或者file的方式去创建Java对象。Jackson不仅仅可以解析JSON到Java对象,也可以将Java对象解析为JSON字符串。 原理:Java反射机制实现JSON和Java对象间数据自动转换。
2.Jackson下载安装:maven依赖方式添加
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.6</version> </dependency>
3.Jackson ObjectMapper Jackson对象映射
从JSON字符串转换为Java对象
ObjectMapper objectMapper = new ObjectMapper(); String carJson ="{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; Car car = objectMapper.readValue(carJson, Car.class);
从JSON Reader转换为Java对象
ObjectMapper objectMapper = new ObjectMapper(); String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 4 }"; Reader reader = new StringReader(carJson); Car car = objectMapper.readValue(reader, Car.class);
从File 文件中转换为Java对象
ObjectMapper objectMapper = new ObjectMapper(); File file = new File("data/car.json"); Car car = objectMapper.readValue(file, Car.class);
从URL(网络或本地资源) 资源转换为Java对象
ObjectMapper objectMapper = new ObjectMapper(); URL url = new URL("file:data/car.json"); Car car = objectMapper.readValue(url, Car.class);
从InputStream 输入流中转换为Java对象
ObjectMapper objectMapper = new ObjectMapper(); InputStream input = new FileInputStream("data/car.json"); Car car = objectMapper.readValue(input, Car.class);
从Byte Array 中转换为Java对象
ObjectMapper objectMapper = new ObjectMapper(); String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; byte[] bytes = carJson.getBytes("UTF-8"); Car car = objectMapper.readValue(bytes, Car.class);
从JSON字符数组中转换为Java对象数组(Array)
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]"; ObjectMapper objectMapper = new ObjectMapper(); Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);
从JSON字符数组中转换为Java对象列表(List)
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]"; ObjectMapper objectMapper = new ObjectMapper(); List<Car> cars1 = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){});
从JSON字符串中转换为Java的Map存储
String jsonObject = "{\"brand\":\"ford\", \"doors\":5}"; ObjectMapper objectMapper = new ObjectMapper(); Map<String, Object> jsonMap = objectMapper.readValue(jsonObject, new TypeReference<Map<String,Object>>(){});
忽略解析JSON字符串中Java对象中没有的字段设置
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
原始类型的空JSON值失败
int 值为null问题。
自定义反序列化器
1.应用 String json = "{ \"brand\" : \"Ford\", \"doors\" : 6 }"; SimpleModule module =new SimpleModule("CarDeserializer", new Version(3, 1, 8, null, null, null)); module.addDeserializer(Car.class, new CarDeserializer(Car.class)); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(module); Car car = mapper.readValue(json, Car.class); 2.定义 import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; public class CarDeserializer extends StdDeserializer<Car> { public CarDeserializer(Class<?> vc) { super(vc); } @Override public Car deserialize(JsonParser parser, DeserializationContext deserializer) throws IOException { Car car = new Car(); while(!parser.isClosed()){ JsonToken jsonToken = parser.nextToken(); if(JsonToken.FIELD_NAME.equals(jsonToken)){ String fieldName = parser.getCurrentName(); System.out.println(fieldName); jsonToken = parser.nextToken(); if("brand".equals(fieldName)){ car.setBrand(parser.getValueAsString()); } else if ("doors".equals(fieldName)){ car.setDoors(parser.getValueAsInt()); } } } return car; } }
从Java对象输出JSON
可以将Java对象输出到,JSON字符串,Byte数组,File外部文件中,OutPutStream输出流中 ObjectMapper objectMapper = new ObjectMapper(); Car car = new Car(); car.brand = "BMW"; car.doors = 4; objectMapper.writeValue( new FileOutputStream("data/output-2.json"), car); String json = objectMapper.writeValueAsString(car); System.out.println(json); String json = objectMapper.writeValueAsBytes(car);
自定义序列化器
1.应用 CarSerializer carSerializer = new CarSerializer(Car.class); ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule("CarSerializer", new Version(2, 1, 3, null, null, null)); module.addSerializer(Car.class, carSerializer); objectMapper.registerModule(module); Car car = new Car(); car.setBrand("Mercedes"); car.setDoors(5); String carJson = objectMapper.writeValueAsString(car); 2.定义 import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; public class CarSerializer extends StdSerializer<Car> { protected CarSerializer(Class<Car> t) { super(t); } public void serialize(Car car, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartObject(); jsonGenerator.writeStringField("producer", car.getBrand()); jsonGenerator.writeNumberField("doorCount", car.getDoors()); jsonGenerator.writeEndObject(); } }
Jackson Date 日期格式化
1.默认Jackson 日期是以1970为开始的int类型的时间值。 2.可以通过 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); objectMapper2.setDateFormat(dateFormat);设置具体Date日期的格式。
Jackson JSON的树模型
1.读取JSON作为Jackson JSON树形式 String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class); } catch (IOException e) { e.printStackTrace(); } String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonNode = objectMapper.readTree(carJson); } catch (IOException e) { e.printStackTrace(); } 2.完整实例 String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5," + " \"owners\" : [\"John\", \"Jack\", \"Jill\"]," + " \"nestedObject\" : { \"field\" : \"value\" } }"; ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class); JsonNode brandNode = jsonNode.get("brand"); String brand = brandNode.asText(); System.out.println("brand = " + brand); JsonNode doorsNode = jsonNode.get("doors"); int doors = doorsNode.asInt(); System.out.println("doors = " + doors); JsonNode array = jsonNode.get("owners"); JsonNode jsonNode = array.get(0); String john = jsonNode.asText(); System.out.println("john = " + john); JsonNode child = jsonNode.get("nestedObject"); JsonNode childField = child.get("field"); String field = childField.asText(); System.out.println("field = " + field); } catch (IOException e) { e.printStackTrace(); }
Jackson 还可以读取COBR,MessagePack,YAML类型的格式化数据
具体操作流程请查阅资料,另需要对用jar包支持。
4.Jackson 的JsonNode对象(树模型)
Read JsonNode From JSON从JSON中读取JsonNode
String json = "{ \"f1\" : \"v1\" } "; ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(json); System.out.println(jsonNode.get("f1").asText());
Write JsonNode to JSON写JsonNode到JSON中
ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = readJsonIntoJsonNode(); String json = objectMapper.writeValueAsString(jsonNode);
Get JsonNode Field取得JsonNode的成员和成员值
//取得成员 JsonNode field1 = jsonNode.get("field1"); //取得成员值 String f2Str = jsonNode.get("f2").asText(); double f2Dbl = jsonNode.get("f2").asDouble(); int f2Int = jsonNode.get("f2").asInt(); long f2Lng = jsonNode.get("f2").asLong();
5.Jackson JsonParser json解析器
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; JsonFactory factory = new JsonFactory(); JsonParser parser = factory.createParser(carJson); Car car = new Car(); while(!parser.isClosed()){ JsonToken jsonToken = parser.nextToken(); if(JsonToken.FIELD_NAME.equals(jsonToken)){ String fieldName = parser.getCurrentName(); System.out.println(fieldName); jsonToken = parser.nextToken(); if("brand".equals(fieldName)){ car.brand = parser.getValueAsString(); } else if ("doors".equals(fieldName)){ car.doors = parser.getValueAsInt(); } } } System.out.println("car.brand = " + car.brand); System.out.println("car.doors = " + car.doors);
6.Jackson JsonParser json生产器
JsonFactory factory = new JsonFactory(); JsonGenerator generator = factory.createGenerator( new File("data/output.json"), JsonEncoding.UTF8); generator.writeStartObject(); generator.writeStringField("brand", "Mercedes"); generator.writeNumberField("doors", 5); generator.writeEndObject(); generator.close();
6.Jackson Annotations Jackson 注解
Read + Write Annotations读和写注解
@JsonIgnore:忽略属性 import com.fasterxml.jackson.annotation.JsonIgnore; public class PersonIgnore { @JsonIgnore public long personId = 0; public String name = null;} @JsonIgnoreProperties:忽略属性组 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties({"firstName", "lastName"}) public class PersonIgnoreProperties { public long personId = 0; public String firstName = null; public String lastName = null;} @JsonIgnoreType:忽略属性的类型 import com.fasterxml.jackson.annotation.JsonIgnoreType; public class PersonIgnoreType { @JsonIgnoreType public static class Address { public String streetName = null; public String houseNumber = null; public String zipCode = null; public String city = null; public String country = null; } public long personId = 0; public String name = null; public Address address = null; } @JsonAutoDetect:json自动检查 import com.fasterxml.jackson.annotation.JsonAutoDetect; @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY ) public class PersonAutoDetect { private long personId = 123; public String name = null; }
Read Annotations读注解
@JsonSetter:设置自定义名称 @JsonAnySetter @JsonCreator @JacksonInject @JsonDeserialize
Write Annotations写注解
@JsonGetter:自定义写值 @JsonInclude @JsonAnyGetter @JsonPropertyOrder @JsonRawValue @JsonValue @JsonSerialize
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
4月1日云栖精选夜读 | 代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市
【点击订阅云栖夜读周刊】 2019年,淘鲜达要在100个城市完成1000个门店的新零售改造。 热点热议 代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市 作者:技术小能手发表在:天下网商 阿里小二的日常工作要被TA们“接管”了! 作者:隐林发表在:阿里巴巴大数据 —玩家社区 说说我为什么看好Spring Cloud Alibaba 作者:程序猿dd 知识整理 SQL Server删除数据库 作者:金澎 ECS和RDS连接条件 作者:金澎 好程序员web前端培训分享Javascript中原型属性 作者:好程序员 基于ECS使用FileZilla Server建立安全的SSL/TLS FTP 作者:bbskkb发表在:阿里云MVP 如何通过报表单元格右键控制报表跳转到不同链接地址 作者:飘然轻落 美文回顾 最快1秒鉴定真假,AI谣言粉碎机来了! 作者:技术小能手 藏经阁计划发布一年,阿里知识引擎有哪些技术突破? 作者:技术小能手发表在:阿里技术 数据报表多种序号生成方式 作者:飘然轻落 好程序员分享做HTML5页面你要懂得这些 作者:好程序员 Android环境下hanlp汉字转拼...
- 下一篇
对话 Ruby 创始人松本行弘、阿里高级技术专家朴灵!
4月25日,云栖社区联合阿里云国际站,特别邀请了Ruby创始人Matz(松本行弘)、阿里云高级技术专家朴灵,来为开发者们分享干货。 在本次活动上可以了解到Ruby语言最新的动态,Ruby和新语言golang在性能方面的差别。听听Matz畅谈他对云原生发展的看法,了解下他最近的动向。可以听到阿里云高级技术专家朴灵分享阿里云在开发语言上的动向,以及对于开发者的支持。 马上免费报名围观:https://yq.aliyun.com/live/920 活动议程: 讲师介绍及演讲内容: 讲师:松本行弘(MatsumotoYukihiro) 1965年生。日本鸟取县米子市出身。毕业于筑波大学第三学群情报学类。Ruby程序设计语言的创始人。在“株式会社网络应用通信研究所”担任特别研究员,“一般财团法人Ruby ”担任理事长等多种职务。 中学二年级时,在父亲的口
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题