Java解析json(二):jackson

 

官方参考

Jackson Home Page:https://github.com/FasterXML/jackson 
Jackson Wiki:http://wiki.fasterxml.com/JacksonHome 
Jackson doc: https://github.com/FasterXML/jackson-docs 
Jackson Download Page:http://wiki.fasterxml.com/JacksonDownload

简介

Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”。

Jackson有两个主要分支,1.x处于维护状态,只会发布bug修复版本。2.x还在积极地开发当中。这两个版本的Java包名和Maven artifact不一样,所以它们不互相兼容,但是可以和平共存,也就是项目可以同时依赖1.x和2.x而不会发生冲突。

Jackson版本: 1.x (目前版本从1.1~1.9)与2.x。1.x与2.x从包的命名上可以看出来,1.x的类库中,包命名以:org.codehaus.jackson.xxx开头,而2.x类库中包命令:com.fastxml.jackson.xxx开头。

本文以2.x为主…

主要模块

1. 核心模块

  1. 核心模块是扩展模块构建的基础,到2.7版本为止,共有3个核心模块(依赖关系从上到下):
  2. ***Streaming*** : jackson-core jar,定义了底层的streaming API和实现了Json特性。
  3. ***Annotations*** : jackson-annotations jar,包含了标准的Jackson注解。
  4. ***Databind*** : jackson-databind jar,实现了数据绑定和对象序列化,它依赖于streamingannotations的包。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.  第三方数据类型模块

这些扩展是插件式的Jackson模块,用ObjectMapper.registerModule()注册,并且通过添加serializers和deserializers以便Databind包(ObjectMapper / ObjectReader / ObjectWriter)可以读写这些类型,来增加对各种常用的Java库的数据类型的支持。参考https://github.com/FasterXML/jacksonThird-party datatype modules。

3. 数据格式模块

Jackson也有处理程序对JAX-RS标准实现者例如Jersey, RESTeasy, CXF等提供了数据格式支持。处理程序实现了MessageBodyReader和MessageBodyWriter,目前支持的数据格式包括JSON, Smile, XML, YAML和CBOR。

数据格式提供了除了Json之外的数据格式支持,它们绝大部分仅仅实现了streaming API abstractions,以便数据绑定组件可以按照原来的方式使用。另一些(几乎不需要)提供了databind标准功能来处理例如schemas。参考https://github.com/FasterXML/jacksonData format modules

准备工作

JDK1.7,依赖jackon的三个核心类库:

  • jackson-core-2.5.3.jar
  • jackson-annotations-2.5.3.jar
  • jackson-databind-2.5.3.jar

maven依赖:

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-core</artifactId>
  4. <version>2.7.4</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.fasterxml.jackson.core</groupId>
  8. <artifactId>jackson-annotations</artifactId>
  9. <version>2.7.4</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.fasterxml.jackson.core</groupId>
  13. <artifactId>jackson-databind</artifactId>
  14. <version>2.7.4</version>
  15. </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

处理Json

Jackson提供了三种可选的Json处理方法:流式API(Streaming API) 、树模型(Tree Model)、数据绑定(Data Binding)。三种处理Json的方式的特性:

  • Streaming API:是效率最高的处理方式(开销低、读写速度快,但程序编写复杂度高)
  • Tree Model:是最灵活的处理方式
  • Data Binding:是最常用的处理方式

1.Data Binding

主要使用ObjectMapper来操作Json,默认情况下会使用BeanSerializer来序列化POJO。 
如果是解析,那么如下的例子里的TestJson必须要有setters,且setters必须是public修饰的,否则属性的值将会为null。 
如果是生成,那么必须有getters,且getters必须是public修饰的。 
如果属性不是private修饰,那么可以不用有getters和setters。(参考访问修饰符) 
要点: 
ObjectMapper mapper = new ObjectMapper();  
mapper.writeValue(jsonFile, Bean); 
mapper.readValue(jsonFile, Bean.class/Collection< Bean >);

(1)生成json

city.java

  1. package com.myjackson.databinding;
  2. //市
  3. public class City {
  4. private Integer id;
  5. private String cityName;
  6. public City(){}
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getCityName() {
  14. return cityName;
  15. }
  16. public void setCityName(String cityName) {
  17. this.cityName = cityName;
  18. }
  19. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

province.java

  1. package com.myjackson.databinding;
  2. import java.util.Date;
  3. import java.util.List;
  4. //省
  5. public class Province {
  6. private Integer id;
  7. private String name;
  8. private Date birthDate;
  9. private List<City> cities;
  10. public Province(){}
  11. public Integer getId() {
  12. return id;
  13. }
  14. public void setId(Integer id) {
  15. this.id = id;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public List<City> getCities() {
  24. return cities;
  25. }
  26. public void setCities(List<City> cities) {
  27. this.cities = cities;
  28. }
  29. public Date getBirthDate() {
  30. return birthDate;
  31. }
  32. public void setBirthDate(Date birthDate) {
  33. this.birthDate = birthDate;
  34. }
  35. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

counry.java

  1. package com.myjackson.databinding;
  2. import java.util.Date;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. //国家
  7. public class Country {
  8. private Integer id;
  9. private String countryName;
  10. private Date establishTime;
  11. private List<Province> provinces;
  12. private String[] lakes;
  13. private Map<String, String> forest = new HashMap<String, String>();
  14. public Country(){
  15. }
  16. public Integer getId() {
  17. return id;
  18. }
  19. public void setId(Integer id) {
  20. this.id = id;
  21. }
  22. public String getCountryName() {
  23. return countryName;
  24. }
  25. public void setCountryName(String countryName) {
  26. this.countryName = countryName;
  27. }
  28. public Date getEstablishTime() {
  29. return establishTime;
  30. }
  31. public void setEstablishTime(Date establishTime) {
  32. this.establishTime = establishTime;
  33. }
  34. public List<Province> getProvinces() {
  35. return provinces;
  36. }
  37. public void setProvinces(List<Province> provinces) {
  38. this.provinces = provinces;
  39. }
  40. public String[] getLakes() {
  41. return lakes;
  42. }
  43. public void setLakes(String[] lakes) {
  44. this.lakes = lakes;
  45. }
  46. public Map<String, String> getForest() {
  47. return forest;
  48. }
  49. public void setForest(Map<String, String> forest) {
  50. this.forest = forest;
  51. }
  52. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

测试案例

  1. @Test
  2. public void Bean2JsonStr() throws ParseException, JsonGenerationException, JsonMappingException, IOException{
  3. // 使用ObjectMapper转化对象为Json
  4. ObjectMapper mapper = new ObjectMapper();
  5. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  6. mapper.setDateFormat(dateFormat); //设置日期序列化格式
  7. City city1 = new City();
  8. city1.setId(1);
  9. city1.setCityName("gz");
  10. City city2 = new City();
  11. city2.setId(2);
  12. city2.setCityName("dg");
  13. Province province = new Province();
  14. province.setId(1);
  15. province.setName("GD");
  16. province.setBirthDate(new Date());
  17. List<City> cities = new ArrayList<City>();
  18. cities.add(city1);
  19. cities.add(city2);
  20. province.setCities(cities);
  21. Country country = new Country();
  22. country.setCountryName("China");
  23. country.setId(1);
  24. country.setEstablishTime(dateFormat.parse("1949-10-01"));
  25. country.setLakes(new String[] { "Qinghai Lake", "Poyang Lake","Dongting Lake", "Taihu Lake" });
  26. HashMap<String, String> forest = new HashMap<String, String>();
  27. forest.put("no.1", "dxal");
  28. forest.put("no.2", "xxal");
  29. country.setForest(forest);
  30. List<Province> provinces = new ArrayList<Province>();
  31. provinces.add(province);
  32. country.setProvinces(provinces);
  33. mapper.configure(SerializationFeature.INDENT_OUTPUT, true); // 为了使JSON视觉上的可读性,在生产中不需如此,会增大Json的内容
  34. mapper.setSerializationInclusion(Include.NON_EMPTY); // 配置mapper忽略空属性
  35. mapper.writeValue(new File("country.json"), country); // 默认情况,Jackson使用Java属性字段名称作为 Json的属性名称,也可以使用Jackson annotations(注解)改变Json属性名称
  36. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

运行得到country.json:

  1. {
  2. "id" : 1,
  3. "countryName" : "China",
  4. "establishTime" : "1949-10-01",
  5. "provinces" : [ {
  6. "id" : 1,
  7. "name" : "GD",
  8. "birthDate" : "2017-02-04",
  9. "cities" : [ {
  10. "id" : 1,
  11. "cityName" : "gz"
  12. }, {
  13. "id" : 2,
  14. "cityName" : "dg"
  15. } ]
  16. } ],
  17. "lakes" : [ "Qinghai Lake", "Poyang Lake", "Dongting Lake", "Taihu Lake" ],
  18. "forest" : {
  19. "no.1" : "dxal",
  20. "no.2" : "xxal"
  21. }
  22. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

(2)解析json

  1. @Test
  2. public void JsonStr2Bean() throws JsonParseException, JsonMappingException, IOException{
  3. ObjectMapper mapper = new ObjectMapper();
  4. File jsonFile = new File("country.json");
  5. //当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
  6. //因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
  7. mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
  8. Country country = mapper.readValue(jsonFile, Country.class);
  9. System.out.println(country.getCountryName()+country.getEstablishTime());
  10. List<Province> provinces = country.getProvinces();
  11. for (Province province : provinces) {
  12. System.out.println("province:"+province.getName() + "\n" + "birthDate:"+province.getBirthDate());
  13. for (City city: province.getCities()) {
  14. System.out.println(city.getId()+" "+city.getCityName());
  15. }
  16. }
  17. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出结果:

  1. ChinaSat Oct 01 08:00:00 CST 1949
  2. province:GD
  3. getBirthDate:Sat Feb 04 08:00:00 CST 2017
  4. 1 gz
  5. 2 dg
  • 1
  • 2
  • 3
  • 4
  • 5

解析的时候如果碰到集合类,那么可以使用TypeReference类

  1. @Test
  2. public void JsonStr2List() throws IOException{
  3. City city1 = new City();
  4. city1.setId(1);
  5. city1.setCityName("gz");
  6. City city2 = new City();
  7. city2.setId(2);
  8. city2.setCityName("dg");
  9. List<City> cities = new ArrayList<City>();
  10. cities.add(city1);
  11. cities.add(city2);
  12. ObjectMapper mapper = new ObjectMapper();
  13. String listJsonStr = mapper.writeValueAsString(cities);
  14. System.out.println(listJsonStr);
  15. List<City> list = mapper.readValue(listJsonStr, new TypeReference<List<City>>(){} );
  16. for (City city: list) {
  17. System.out.println("id:"+city.getId()+" cityName:"+city.getCityName());
  18. }
  19. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.Streaming API

Jackson提供了一套底层API来解析Json字符串,这个API为每个Json对象提供了符号。例如, ‘{’ 是解析器提供的第一个对象(writeStartObject()),键值对是解析器提供的另一个单独对象(writeString(key,value))。这些API很强大,但是需要大量的代码。大多数情况下,Tree Model和Data Binding可以代替Streaming API。

上面代码如果注释掉 city1.setId(1);这行,结果为:

  1. [{"id":null,"cityName":"gz"},{"id":2,"cityName":"dg"}]
  2. id:null cityName:gz
  3. id:2 cityName:dg
  • 1
  • 2
  • 3

但假如想让id为null的不输出,不为null的输出除了  mapper.setSerializationInclusion(Include.NON_EMPTY); // 配置mapper忽略空属性 这种方法外还可以在ObjectMapper中注册一个自定义的序列化JsonSerializer和反序列化 
JsonDeSerializer:

CityJsonSerializer.java

  1. package com.myjackson.databinding;
  2. import java.io.IOException;
  3. import com.fasterxml.jackson.core.JsonGenerator;
  4. import com.fasterxml.jackson.core.JsonProcessingException;
  5. import com.fasterxml.jackson.databind.JsonSerializer;
  6. import com.fasterxml.jackson.databind.SerializerProvider;
  7. public class CityJsonSerializer extends JsonSerializer<City>{
  8. @Override
  9. public void serialize(City city, JsonGenerator jsonGenerator, SerializerProvider arg2)
  10. throws IOException, JsonProcessingException {
  11. jsonGenerator.writeStartObject();
  12. if ( city.getId()!=null) {
  13. jsonGenerator.writeNumberField("id", city.getId());
  14. }
  15. jsonGenerator.writeStringField("cityName", city.getCityName());
  16. jsonGenerator.writeEndObject();
  17. }
  18. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

CityJsonDeSerializer.java

  1. package com.myjackson.databinding;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import com.fasterxml.jackson.core.JsonParser;
  6. import com.fasterxml.jackson.core.JsonProcessingException;
  7. import com.fasterxml.jackson.core.JsonToken;
  8. import com.fasterxml.jackson.databind.DeserializationContext;
  9. import com.fasterxml.jackson.databind.JsonDeserializer;
  10. public class CityJsonDeSerializer extends JsonDeserializer<List<City>>{
  11. @Override
  12. public List<City> deserialize(JsonParser parser,DeserializationContext deserializationcontext) throws IOException,
  13. JsonProcessingException {
  14. List<City> list = new ArrayList<City>();
  15. // 开始解析数组,第一个JsonToken必须是JsonToken.START_ARRAY"["
  16. if (!JsonToken.START_ARRAY.equals(parser.getCurrentToken())) {
  17. System.out.println(parser.getCurrentToken());
  18. return null;
  19. }
  20. // 解析符号直到字符串结尾
  21. while (!parser.isClosed()) {
  22. // 如果有必要的话,这个方法会沿着流前进直到足以确下一个JsonToken的类型
  23. JsonToken token = parser.nextToken();
  24. // 如果是最后一个JsonToken,那么就结束了
  25. if (token == null)
  26. break;
  27. // 数组的每个元素都是对象,因此下一个JsonToken是JsonToken.START_OBJECT"{"
  28. if (!JsonToken.START_OBJECT.equals(token)) {
  29. break;
  30. }
  31. City city = null;
  32. // 输出id字段的值
  33. while (true) {
  34. if (JsonToken.START_OBJECT.equals(token)) {
  35. city = new City();
  36. }
  37. token = parser.nextToken();
  38. if (token == null)
  39. break;
  40. if (JsonToken.FIELD_NAME.equals(token) ) {
  41. if("id".equals(parser.getCurrentName())){
  42. token = parser.nextToken();
  43. city.setId(parser.getIntValue());
  44. }else if("cityName".equals(parser.getCurrentName())){
  45. token = parser.nextToken();
  46. city.setCityName(parser.getText());
  47. }
  48. }
  49. if(JsonToken.END_OBJECT.equals(token)){
  50. list.add(city);
  51. }
  52. }
  53. }
  54. return list;
  55. }
  56. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

测试:

  1. @Test
  2. public void StreamJsonStr2List() throws IOException{
  3. City city1 = new City();
  4. //city1.setId(1);
  5. city1.setCityName("gz");
  6. City city2 = new City();
  7. city2.setId(2);
  8. city2.setCityName("dg");
  9. List<City> cities = new ArrayList<City>();
  10. cities.add(city1);
  11. cities.add(city2);
  12. ObjectMapper mapper = new ObjectMapper();
  13. SimpleModule module = new SimpleModule();
  14. module.addSerializer(City.class, new CityJsonSerializer());
  15. mapper.registerModule(module);
  16. String listJsonStr = mapper.writeValueAsString(cities);
  17. System.out.println(listJsonStr);
  18. ObjectMapper mapper2 = new ObjectMapper();
  19. SimpleModule module2 = new SimpleModule();
  20. module2.addDeserializer(List.class, new CityJsonDeSerializer());
  21. mapper2.registerModule(module2);
  22. List<City> list = mapper2.readValue(listJsonStr, new TypeReference<List<City>>(){} );
  23. for (City city: list) {
  24. System.out.println("id:"+city.getId()+" cityName:"+city.getCityName());
  25. }
  26. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

也可以简单一点,使用注解,省去在ObjectMapper 中注册SimpleModule

  1. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  2. @JsonSerialize(using=CityJsonSerializer.class)
  3. public class City {
  4. ...
  5. }
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

  1. [{"cityName":"gz"},{"id":2,"cityName":"dg"}]
  2. id:null cityName:gz
  3. id:2 cityName:dg
  • 1
  • 2
  • 3

###3.Tree Mode 
如果不想为Json结构写一个class的话,Tree Mode是一个很好的选择。

生成json:

  1. @Test
  2. public void TreeMode2Json() throws IOException{
  3. //创建一个节点工厂,为我们提供所有节点
  4. JsonNodeFactory factory = new JsonNodeFactory(false);
  5. //创建一个json factory来写tree modle为json
  6. JsonFactory jsonFactory = new JsonFactory();
  7. //创建一个json生成器
  8. JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File("country2.json")));
  9. //注意,默认情况下对象映射器不会指定根节点,下面设根节点为country
  10. ObjectMapper mapper = new ObjectMapper();
  11. ObjectNode country = factory.objectNode();
  12. country.put("id", 1);
  13. country.put("countryName","China");
  14. country.put("establishTime", "1949-10-01");
  15. ArrayNode provinces = factory.arrayNode();
  16. ObjectNode province = factory.objectNode();
  17. ObjectNode city1 = factory.objectNode();
  18. city1.put("id", 1);
  19. city1.put("cityName", "gz");
  20. ObjectNode city2 = factory.objectNode();
  21. city2.put("id", 1);
  22. city2.put("cityName", "dg");
  23. ArrayNode cities = factory.arrayNode();
  24. cities.add(city1).add(city2);
  25. province.put("cities", cities);
  26. provinces.add(province);
  27. country.put("provinces",provinces);
  28. ArrayNode lakes = factory.arrayNode();
  29. lakes.add("QingHai Lake").add("Poyang Lake").add("Dongting Lake").add("Taihu Lake");
  30. country.put("lakes",lakes);
  31. ObjectNode forest = factory.objectNode();
  32. forest.put("no.1","dxal");
  33. forest.put("no.2", "xxal");
  34. country.put("forest", forest);
  35. mapper.setSerializationInclusion(Include.NON_EMPTY); // 配置mapper忽略空属性
  36. mapper.writeTree(generator, country);
  37. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

结果:

  1. {
  2. "id":1,
  3. "countryName":"China",
  4. "establishTime":"1949-10-01",
  5. "provinces":[
  6. {"cities":[
  7. {"id":1,"cityName":"gz"},
  8. {"id":1,"cityName":"dg"}
  9. ]
  10. }
  11. ],
  12. "lakes":["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"],
  13. "forest":{"no.1":"dxal","no.2":"xxal"}
  14. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

读取json:

  1. @Test
  2. public void TreeModeReadJson() throws IOException{
  3. ObjectMapper mapper = new ObjectMapper();
  4. // Jackson提供一个树节点被称为"JsonNode",ObjectMapper提供方法来读json作为树的JsonNode根节点
  5. JsonNode node = mapper.readTree(new File("country2.json"));
  6. // 看看根节点的类型
  7. System.out.println("node JsonNodeType:"+node.getNodeType());
  8. System.out.println("---------得到所有node节点的子节点名称----------------------");
  9. Iterator<String> fieldNames = node.fieldNames();
  10. while (fieldNames.hasNext()) {
  11. String fieldName = fieldNames.next();
  12. System.out.print(fieldName+" ");
  13. }
  14. System.out.println("\n---------------------------------------------------");
  15. JsonNode lakes = node.get("lakes");
  16. System.out.println("lakes:"+lakes+" JsonNodeType:"+lakes.getNodeType());
  17. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

运行结果:

  1. node JsonNodeType:OBJECT
  2. ---------得到所有node节点的子节点名称-------------------------
  3. id countryName establishTime provinces lakes forest
  4. -----------------------------------------------------
  5. lakes:["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"] JsonNodeType:ARRAY
  • 1
  • 2
  • 3
  • 4
  • 5

结束

Stream API方式是开销最低、效率最高,但编写代码复杂度也最高,在生成Json时,需要逐步编写符号和字段拼接json,在解析Json时,需要根据token指向也查找json值,生成和解析json都不是很方便,代码可读性也很低。 
Databinding处理Json是最常用的json处理方式,生成json时,创建相关的java对象,并根据json内容结构把java对象组装起来,最后调用writeValue方法即可生成json, 
解析时,就更简单了,直接把json映射到相关的java对象,然后就可以遍历java对象来获取值了。 
TreeModel处理Json,是以树型结构来生成和解析json,生成json时,根据json内容结构,我们创建不同类型的节点对象,组装这些节点生成json。解析json时,它不需要绑定json到java bean,根据json结构,使用path或get方法轻松查找内容。 
以上为个人参考网上博客以及一些个人实践,不对之处烦请指正,感激不尽~

参考:

http://blog.csdn.net/gjb724332682/article/details/51586701# 
http://blog.csdn.net/java_huashan/article/details/46375857

 

Java解析json(二):jackson的更多相关文章

  1. Java解析json字符串和json数组

    Java解析json字符串和json数组 public static Map<String, String> getUploadTransactions(String json){ Map ...

  2. java解析Json字符串之懒人大法

    面对Java解析Json字符串的需求,有很多开源工具供我们选择,如google的Gson.阿里巴巴的fastJson.在网上能找到大量的文章讲解这些工具的使用方法.我也是参考这些文章封装了自己的Jso ...

  3. Introduction to Structured Data json的2种形式 JAVA解析JSON数据 - JsonArray JsonObject

    https://developers.google.com/search/docs/guides/intro-structured-data Structured data refers to kin ...

  4. java解析json数组

      java解析json数组 import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; ...

  5. Java解析JSON文件的方法

    http://blog.sina.com.cn/s/blog_628cc2b70101dydc.html java读取文件的方法 http://www.cnblogs.com/lovebread/ar ...

  6. java解析json字符串详解(两种方法)

    一.使用JSONObject来解析JSON数据官方提供的,所以不需要导入第三方jar包:直接上代码,如下 private void parseJSONWithJSONObject(String Jso ...

  7. 除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?

    昨天下午 5 点 10 分左右,我解决掉了最后一个 bug,轻舒一口气,准备关机下班.可这个时候,老板朝我走来,脸上挂着神秘的微笑,我就知道他不怀好意.果不其然,他扔给了我一个新的需求,要我在 Jav ...

  8. java解析json

    1:下载另外一个Java的小包就可以了: http://www.JSON.org/java/json_simple.zip 里面有源码和文档例题和编程的lib包:编程只需要json_simple.ja ...

  9. java 解析json的问题

    本文转载自http://chriszz.sinaapp.com/?p=392 Json就是Javascript notation,可以替代XML,用做数据交互. Json的两种基本表示形式,可以用自动 ...

随机推荐

  1. PHPNOW如何添加虚拟主机

    1 打开PHPNow控制面板,输入0,点回车 2 新增主机名称(你可以输入127.0.0.2到127.0.0.255),点击回车之后要求输入主机别名,不要写,直接回车,再要求输入网站目录,也不选,再回 ...

  2. xmpp 服务器配置 open fire for windows 及 spark 测试

    xmpp 服务器配置 open fire for windows 此文章为 XMPP windows服务器配置,使用的是 open fire 3.9.1.exe 1: 下载 open fire ope ...

  3. 推荐一个在线json数据格式化网站

    json数据非常友好方便的处理: 推荐一个在线json数据格式化网站 http://json.parser.online.fr/

  4. tomcat启动报错,找不到相应的 queue,从而引发内存泄漏

    tomcat启动报错,无法创建 bean listenerStatusChangeDealHandler, no queue 'STOCK.NOTIFY_CHANGE.INTER.CACHE.QUEU ...

  5. xmu 1125 越野车大赛(公式推导&amp;&amp;三分)(中等)

    xmu 1125.越野车大赛 Description TheBeet正在參加一场越野车大赛.比赛的场地如右图:共分三块.每一块地面的长宽均为N与M,但地表情况不同.越野车在这段路面上的最快速度也不同. ...

  6. 算法笔记_130:行列递增矩阵的查找(Java)

    目录 1 问题描述 2 解决方案 2.1定位法   1 问题描述 在一个m行n列的二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列.现在输入这样的一个二维数组和一个整 ...

  7. Drawing points

    A point is the most simple graphics object that can be drawn. It is a small spot on the window. #!/u ...

  8. Servlet 异常处理

    当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置.您必须在 web.xml 中使用 error-pa ...

  9. 【laravel54】创建控制器、模型

    1.创建控制器(可以带上下一级目录)=>(需要带Controller后缀) > php artisan make:controller self/StudentController; 2. ...

  10. Git使用教程(全)

    Git是什么? Git是目前世界上最先进的开源的分布式版本控制系统(没有之一),用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开 ...