一.JSON的格式介绍
1.1 JSON数据及格式
【1】JSON数据及作用
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
【2】JSON数据的3种格式
1.2简单json解析
json解析方式:org.json
json数据准备
org.json依赖
-
<dependency> <groupId>org.json<groupId> <artifactId>json<artifactId> <version>${json.version}<version> </dependency>
json解析程序
- (1) 创建VehicleJson1对象
- (2) 根据json字符串获得JsonNode对象
- (3) 根据key设置对象属性值
// json对象
public class VehicleJson1 {
private Integer batteryAlarm;
private Integer carMode;
private Double minVoltageBattery;
private Integer chargeStatus;
private String vin;
// 省略get、set方法、构造方法、toString方法
}
// json解析测试类
public class JsonParseTest {
public static void main(String[] args) {
String jsonStr1 = "{\"batteryAlarm\": 0, \"carMode\": 1,\"minVoltageBattery\": 3.89, \"chargeStatus\": 1,\"vin\": \"LS5A3CJC0JF890971\"}";
try {
VehicleJson1 vehicleJson1 = parseJson1(jsonStr1);
System.out.println(vehicleJson1);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
/**
* @param content
* @return VehicleJson1
* @desc : json解析方法1:
* 使用jakson方式解析json:使用JSONObject对象中的构造方法获得JsonObject对象,然后根据name获得value
*/
private VehicleJson1 parseJsonVehicle1(String content) {
// 1.获得JSONObject
JSONObject jsonObject = new JSONObject(content);
// 3.根据json的name获得value
int batteryAlarm = jsonObject.getInt("batteryAlarm");
int carMode = jsonObject.getInt("carMode");
double minVoltageBattery = jsonObject.getDouble("minVoltageBattery");
int chargeStatus = jsonObject.getInt("chargeStatus");
String vin = jsonObject.getString("vin");
// 3.把解析后的json封装成对象
VehicleJson1 json1 = new VehicleJson1(batteryAlarm, carMode, (float) minVoltageBattery, chargeStatus, vin);
return json1;
}
1.3复杂json解析(org.json)
json数据
{"batteryAlarm": 0,"carMode": 1,"minVoltageBattery": 3.89,"chargeStatus": 1,"vin": "LS5A3CJC0JF890971","nevChargeSystemTemperatureDtoList": [{"probeTemperatures": [25, 23, 24, 21, 24, 21, 23, 21, 23, 21, 24, 21, 24, 21, 25, 21],"chargeTemperatureProbeNum": 16,"childSystemNum": 1}]}
根据key设置对象属性值
(1) 获取key对应value为map的值
(2) 获取key对应value为list的值
// json对应对象
public class VehicleJson2 {
private Integer batteryAlarm;
private Integer carMode;
private Double minVoltageBattery;
private Integer chargeStatus;
private String vin;
private List<Integer> probeTemperatures;
private Integer chargeTemperatureProbeNum;
private Integer childSystemNum;
// 省略get、set方法、构造方法、toString方法
}
// json测试类
public class JsonParseTest {
public static void main(String[] args) {
String jsonStr1 = "{\"batteryAlarm\": 0, \"carMode\": 1,\"minVoltageBattery\": 3.89, \"chargeStatus\": 1,\"vin\": \"LS5A3CJC0JF890971\"}";
String jsonStr2 = "{\"batteryAlarm\": 0,\"carMode\": 1,\"minVoltageBattery\": 3.89,\"chargeStatus\": 1,\"vin\": \"LS5A3CJC0JF890971\",\"nevChargeSystemTemperatureDtoList\": [{\"probeTemperatures\": [25, 23, 24, 21, 24, 21, 23, 21, 23, 21, 24, 21, 24, 21, 25, 21],\"chargeTemperatureProbeNum\": 16,\"childSystemNum\": 1}]}";
/*try {
VehicleJson1 vehicleJson1 = parseJson1(jsonStr1);
System.out.println(vehicleJson1);
} catch (JsonProcessingException e) {
e.printStackTrace();
}*/
VehicleJson2 vehicleJson2 = parseJson2(jsonStr2);
System.out.println(vehicleJson2);
}
}
/**
* 使用org.json方式解析复杂json: 使用JSONObject构造根据json字符串构造json对象,根据key获得值,如遇数组,则使用JsonArray获得json数组对象
*/
private VehicleJson2 jsonParseVehicle2(String jsonString) {
// 1.把json字符串转换称为JSONObject
JSONObject jsonObject = new JSONObject(jsonString);
int batteryAlarm = jsonObject.getInt("batteryAlarm");
int carMode = jsonObject.getInt("carMode");
float minVoltageBattery = jsonObject.getFloat("minVoltageBattery");
int chargeStatus = jsonObject.getInt("chargeStatus");
// 问题:上面的四个值的解析,是否也可以直接使用jsonObject.getString来直接获取字符串值?
// 不能使用getString获得int的值,但是可以通过get对应类型获取值
String vin = jsonObject.getString("vin");
// 2.对其中key为"nevChargeSystemTemperatureDtoList"进行解析
// 2.1.把nevChargeSystemTemperatureDtoList的值转换称为list
// 2.2.把list中的第一个元素获取到
// 2.3.获得map,包含3个元素的map值
JSONArray nevChargeSystemTemperatureDtoList = jsonObject.getJSONArray("nevChargeSystemTemperatureDtoList");
JSONObject jo = (JSONObject) nevChargeSystemTemperatureDtoList.get(0);
JSONArray probeTemperatures = jo.getJSONArray("probeTemperatures");
List<Integer> probeTemperatureList = new ArrayList<>();
for (Object o : probeTemperatures.toList()) {
probeTemperatureList.add((Integer)o);
}
int chargeTemperatureProbeNum = jo.getInt("chargeTemperatureProbeNum");
int childSystemNum = jo.getInt("childSystemNum");
// 3.返回一个VechicleJson2的对象
VehicleJson2 vechicleJson2 = new VehicleJson2(batteryAlarm, carMode, minVoltageBattery, chargeStatus, vin, probeTemperatureList, chargeTemperatureProbeNum, childSystemNum);
return vechicleJson2;
}
1.4 Json解析逻辑优化(第二种json解析方法)
-
由于json中的key可能存在空的情况,即key:value不存在的情况,因为不能对每一条json数据都直接根据key获得值,需要先把json转换为map,再进行转换,具体步骤:
1.把json字符串转换成JSONObject对象
2.然后把JSONObject对象转换成map
3、map根据json中的key获得值,如果值不存在,即给对应类型的默认值,也就是说map方法根据key获得值的时候,需要使用getOrDefault方法
4.如果遇到json中的value为list的情况(list中嵌套多个key,value),经过步骤3之后,把json的value转换成list。
list情况1:list中嵌套多个key,value
list情况2:list中是同类型的数组,为了方便获得value,只取第一个
注意:此时的value为list类型,默认值需要为 new ArrayList()).toString()
5.在jsonToList中,需要把上一步的结果字符串转换为JSONArray对象,然后遍历每个元素,把JSONArray中的元素,调用jsonToMap方法转换为HashMap类型,因此jsonToList方法返回值为: List<Map<String, Object>>
6.继续转换,直至完全转换成功
// org.json第二种解析方式:先转换json为map,再获取值(如有json树结构,则继续获得二级json内容)
public static VehicleJson2 parseJson2Second(String jsonStr) {
HashMap jsonToMap = jsonToMap(jsonStr);
Integer batteryAlarm = Integer.parseInt(jsonToMap.getOrDefault("batteryAlarm", 0).toString());
Integer carMode = Integer.parseInt(jsonToMap.getOrDefault("carMode", 0).toString());
Float minVoltageBattery = Float.parseFloat(jsonToMap.getOrDefault("minVoltageBattery", 0).toString());
Integer chargeStatus = Integer.parseInt(jsonToMap.getOrDefault("chargeStatus", 0).toString());
String vin = jsonToMap.getOrDefault("vin", "").toString();
List<Map<String, Object>> probeTemperaturesList = jsonToList(jsonToMap.getOrDefault("nevChargeSystemTemperatureDtoList", "").toString());
// 只取nevChargeSystemTemperatureDtoList中的第一个元素,map
Map<String, Object> probeTemperaturesMap = probeTemperaturesList.get(0);
JSONArray jsonArray = (JSONArray) probeTemperaturesMap.getOrDefault("probeTemperatures", new JSONArray());
List<Integer> probeTemperatures = new ArrayList<>();
for (Object element : jsonArray) {
probeTemperatures.add(Integer.parseInt(element.toString()));
}
Integer chargeTemperatureProbeNum = Integer.parseInt(probeTemperaturesMap.getOrDefault("chargeTemperatureProbeNum", 0).toString());
Integer childSystemNum = Integer.parseInt(probeTemperaturesMap.getOrDefault("childSystemNum", 0).toString());
return new VehicleJson2(batteryAlarm, carMode, minVoltageBattery, chargeStatus, vin, probeTemperatures, chargeTemperatureProbeNum, childSystemNum);
}
/**
* @desc:将Json对象转换成Map
* @param jsonString
* @return Map对象
* @throws JSONException
*/
public static HashMap jsonToMap(String jsonString) throws JSONException {
JSONObject jsonObject = new JSONObject(jsonString);
HashMap result = new HashMap();
Iterator iterator = jsonObject.keys();
String key = null;
Object value = null;
while (iterator.hasNext()) {
key = (String) iterator.next();
value = jsonObject.get(key);
result.put(key, value);
}
return result;
}
/**
* @desc:将数组转换为List,数组内部的json字符串转换为map
* @param jsonString
* @return List<Map<String, Object>>
* @throws JSONException
*/
public static List<Map<String, Object>> jsonToList(String jsonString) throws JSONException {
List<Map<String, Object>> resultList = new ArrayList();
JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i++) {
HashMap map =jsonToMap(jsonArray.get(i).toString());
resultList.add(map);
}
return resultList;
}
二.将Java对象转成JSON字符串
JSON转换工具介绍
1、JSON转换工具的作用;
json的转换工具是通过java封装好的一些jar工具包,直接将java对象或集合转换成json格式的字符串。
2、常用的JSON转换工具;
3、Jackson把Java对象转换成JSON字符串的API;
方法名 | 作用 | 说明 |
---|---|---|
new ObjectMapper() | 创建ObjectMapper对象 | |
writeValueAsString(Object obj) | 使用ObjectMapper对象,把任意类型数据转换为JSON字符串 |
jackson应用
目标
使用jackson把java对象转换成JSON字符串;
步骤
1. 导入上面的三个jar包,复制到WEB-INF\lib目录下
2. 创建一个User类:包含id,username,age三个属性
3. 在main函数中,实例化User对象,给属性赋值
4. 创建一个字符串数组对象,包含三个字符串
5. 创建一个List<User>,包含三个用户对象
6. 创建一个Map对象,键名为:user,键为User对象
7. 实例化ObjectMapper对象,调用writeValueAsString()方法输出转换后的字符串对象
实现
User
package com.itheima.entity;
public class User {
private int id;
private String username;
private int age;
public User(int id, String username, int age) {
this.id = id;
this.username = username;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
'}';
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
转换代码
package com.heima.json;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.heima.bean.User;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author buguniao
* @version v1.0
* @date 2019/3/30 17:34
* @description TODO
**/
public class JacksonTest {
public static void main(String[] args) throws JsonProcessingException {
//创建User对象
User user = new User(100,"张三", 25);
//创建对象
ObjectMapper mapper = new ObjectMapper();
//调用方法
String userJson = mapper.writeValueAsString(user);
System.out.println("userJson = " + userJson);
//创建一个字符串的数组
String[] names = {"张三","李四","王五"};
String arrJson = mapper.writeValueAsString(names);
System.out.println("arrJson = " + arrJson);
//创建一个List集合
List<User> users = new ArrayList<>();
users.add(new User(1,"孙悟空", 25));
users.add(new User(2,"猪八戒", 23));
users.add(new User(3,"白骨精", 20));
String usersJson = mapper.writeValueAsString(users);
System.out.println("usersJson = " + usersJson);
//创建一个Map对象
Map<String, User> map = new HashMap<>();
map.put("user", new User(1,"孙悟空", 25));
String mapJson = mapper.writeValueAsString(map);
System.out.println("mapJson = " + mapJson);
}
}
小结
ObjectMapper对象中的方法 | 说明 |
---|---|
String writeValueAsString(Object o) | 将参数指定的对象转成JSON格式的字符串 |
(1,“孙悟空”, 25));
String mapJson = mapper.writeValueAsString(map);
System.out.println("mapJson = " + mapJson);
}
}
[外链图片转存中...(img-yUB7y6Lg-1612245845582)]
#### 小结
| **ObjectMapper对象中的方法** | **说明** |
| ----------------------------------------- | ------------------------------------ |
| **String writeValueAsString(Object o)** | 将参数指定的对象转成JSON格式的字符串 |