Json详解

Json介绍

我们在开发基于网络的程序时,经常会使用到JSON。

相比XML这种数据交换格式来说,JSON相对解析更加简单一些,因此客户端和服务器的数据交换格式往往通过JSON进行交换。

1、什么是JSON?

JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。

采用一种完全独立于编程语言的“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言

简洁和清晰的层次结构,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

2、JSON格式

(1)对象Object

以(key/value)对形式存在的无序的JsonObject对象,

一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号); “名称/值”对之间使用“,”(逗号)

例如:

{"name":"lihuawei"}

这就是一个最简单的json对象,对于这种数据格式,key值必须是String,而value则可以是String,Number,Object,Array等数据类型。

(2)数组Array

有序的value的集合,这种形式被称为是JsonArray,数组是值(value)的有序集合。

一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

例如,

[{"Name" : "Jim"},{"Name" : "Jerry"}]  
[{"Name" : "Jim", "Age" : 22} , {"Name" : "Jerry", "Age" : 23}]

如果数组中没有一个JSON对象,那这个JSON数组就是空数组。

[] // 空数组

3、JSON的值

JSON 值可以是:

  • 字符串(在双引号中)
  • 数字(整数或浮点数)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null(意思是空值)

4、JSON的嵌套

JSON的嵌套就比较复杂了。

何为嵌套呢?那就是JSON对象的值不是一个简单的值类型,而是另一个完整的JSON对象,甚至JSON数组。

(1)JSON中嵌套JSON对象

{"Info":{"Name":"Zhangsan","Height":"180cm"}}

(2)JSON中嵌套数组

{"Address":[{"Pronvice":"山东","City":"烟台"},{"Pronvice":"江苏","City":"苏州"}]}

 

JSON解析

1、Android中解析JSON

Android的json解析部分都在包org.json下,主要有以下几个类:

JSONObject

例如,解析如下格式的JSON,通过分析可以看出,这个JSON就是一个JSONObject。
{
    "msg": "操作成功",
    "code": 200,
    "token": "eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImIzODI4NWUzLTY2NDgtNGIwYi04ZGNmLTk4YzNkMzc3ZjEwNyJ9.bR6Tm9SujlTbjb9G4npDBuhgIt6-UVZ4AaLFKs4wVvDPQOfI8QOcmjjhKQPowEpBoc5NRYm4Rswg4WiCcOciwA"
}
我们定义一个Bean类
public class LoginData {
    private int code;
    private String msg;
    private String token;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    @Override
    public String toString() {
        return "LoginData{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", token='" + token + '\'' +
                '}';
    }
}
解析JSON的方法
    /**
     * 原生的JSON解析方式,单个对象
     * Json形式:{"msg":"操作成功","code":200,"token":"XXXX123"}
     *
     * @param jsonString
     * @return 登录信息
     */
    public static LoginData getObjectByJson(String jsonString) {
        LoginData loginData = null;
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            loginData = new LoginData();
            loginData.setCode((int) jsonObject.get("code"));
            loginData.setMsg((String) jsonObject.get("msg"));
            loginData.setToken((String) jsonObject.get("token"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return loginData;
    }
JSONArray

 

    /**
     * JSON 解析方法
     *
     * @param jsonData
     * @return String
     */
    public static String readJSONContent(String jsonData) {
        try {
            Log.d(TAG, "readJSONContent: jsonData = " + jsonData);
            StringBuffer sb = new StringBuffer();
            JSONArray jsonArray = new JSONArray(jsonData);
            Log.d(TAG, "readJSONContent: jsonArray = " + jsonArray.length());
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                sb.append(jsonObject.getString("total") + "\n");
                sb.append(jsonObject.getString("rows") + "\n");
            }
            return sb.toString();
        } catch (JSONException e) {
            Log.e(TAG, "readJSONContent: " + e.toString());
            return e.toString();
        }
    }

 

 

 

2、使用Gson库解析JSON

导入gson库

 

posted @ 2022-08-22 16:21  熊猫Panda先生  阅读(425)  评论(0编辑  收藏  举报