JSON

一.JSON的格式介绍

1.1 JSON数据及格式

【1】JSON数据及作用

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

【2】JSON数据的3种格式

1553219155138

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

    img

    list情况2:list中是同类型的数组,为了方便获得value,只取第一个

    img

    注意:此时的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转换工具;

1553220531567

3、Jackson把Java对象转换成JSON字符串的API;

1553938727740

方法名作用说明
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);

    }
}

1553220609048

小结
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格式的字符串 |
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值