Java处理json有很多种方法,在这里总结一下。
1 Jackson
Spring MVC 默认采用Jackson解析Json,出于最小依赖的考虑,也许Json解析第一选择就应该是Jackson。
1.1 引入的包
Jackson核心模块由三部分组成:jackson-core、jackson-annotations、jackson-databind。
由于jackson-databind 依赖 jackson-core 和 jackson-annotations,所以只显示地添加jackson-databind依赖,jackson-core 和 jackson-annotations 就会隐式地添加到 Java 项目工程中。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
1.2 ObjectMapper类
ObjectMapper
类是Jackson中基于“对象绑定”的API,可以将JSON映射到Java对象(反序列化),也可以将Java对象映射到JSON(序列化)
默认情况下,Jackson通过匹配JSON字段名称
与Java类的getter&setter
方法名,将JSON的字段映射到Java类的属性。Jackson删除了getter&setter
方法名称的get
和set
部分,并将其余名称的第一个字符转换为小写后,和JSON字段名称做比较,相同即匹配上。
举例,如果有Java类如下:
public class Car {
private String brand = null;
private int doors = 0;
// getter & Setter
public String getBrand() { return this.brand; }
public void setBrand(String brand){ this.brand = brand;}
public int getDoors() { return this.doors; }
public void setDoors(int doors) { this.doors = doors; }
}
1.2.1 反序列化:从JSON获得Java对象
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // false表示忽略没有匹配上的JSON字段
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; // JSON字符串
Car car = objectMapper.readValue(carJson, Car.class); // 从JSON字符串获取对象
Reader reader = new StringReader(carJson); // JSON字符输入流
car = objectMapper.readValue(reader, Car.class); // 从JSON字符输入流获取对象
// 类似的还有从File对象、URL对象、InputStream对象(字节输入流)、字节数组等获取java对象
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]"; // JSON字符串(数组)
List<Car> cars = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){}); // 从JSON数组字符串获取Java对象的数组
String jsonObject = "{\"brand\":\"ford\", \"doors\":5}"; // JSON字符串(Map)
Map<String, Object> jsonMap = objectMapper.readValue(jsonObject,
new TypeReference<Map<String,Object>>(){}); // 从JSON字符串获取Java Map
注意:还可以自定义反序列化规则,这里不详解。
1.2.2 序列化:将Java对象写入JSON
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car();
car.setBrand("BMW");
car.setDoors(4);
String json = objectMapper.writeValueAsString(car); // 将Java对象序列化为JSON字符串
objectMapper.writeValue(new FileOutputStream("data/output-2.json"), car); // 将Java对象序列化为JSON字符串并写入文件
注意:同样可以自定义序列化规则,这里不详解。文章来源:https://www.toymoban.com/news/detail-410323.html
1.3 JsonNode类
如果不知道接收到的JSON格式,可以将其转换为JsonNode类,即Jackson的JSON树模型。文章来源地址https://www.toymoban.com/news/detail-410323.html
1.3.1 JSON字符串和JsonNode对象相互转换
ObjectMapper objectMapper = new ObjectMapper();
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
try {
JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class); // 将JSON字符串转为JsonNode对象
// JsonNode jsonNode = objectMapper.readTree(carJson); // 和上一行代码功能完全相同
} catch (IOException e) {
e.printStackTrace();
}
String json = objectMapper.writeValueAsString(jsonNode); // 将JsonNode对象转为JSON字符串
1.3.2 JsonNode类访问JSON字段
ObjectMapper objectMapper = new ObjectMapper();
String carJson =
"{ \"brand\" : \"Mercedes\", \"doors\" : 5," +
" \"owners\" : [\"John\", \"Jack\", \"Jill\"]," +
" \"nestedObject\" : { \"field\" : \"value\" } }";
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);
// 子JSON
JsonNode child = jsonNode.get("nestedObject");
JsonNode childField = child.get("field");
String field = childField.asText();
System.out.println("field = " + field);
} catch (IOException e) {
e.printStackTrace();
}
1.3.3 Java对象和JsonNode对象相互转换
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car();
car.brand = "Cadillac";
car.doors = 4;
JsonNode carJsonNode = objectMapper.valueToTree(car); // Java对象转JsonNode对象
Car car0 = objectMapper.treeToValue(carJsonNode); // JsonNode对象转Java对象
1.3.4 JsonNode类的set、put、remove
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode(); // 创建空的JsonNode对象
JsonNode childNode = readJsonIntoNode();
objectNode.set("child1", childNode); // 使用set方法给JsonNode添加子Node
objectNode.put("field1", "value1"); // 使用put方法给JsonNode添加字段
objectNode.remove("field1"); // 使用remove方法删除JsonNode某字段
1.3.5 循环JsonNode所有字段
Iterator<String> fieldNames = jsonNode.fieldNames(); // 创建Iterator遍历JsonNode字段
while(fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode field = jsonNode.get(fieldName);
}
1.4 JsonParser类
1.5 JsonGenerator类
2 fastjson
3 Gson
到了这里,关于Java处理JSON的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!