Carson带你学序列化:深入分析JSON多种解析方式(Gson、AS自带org.json、Jackson)

您所在的位置:网站首页 Jackson解析xml对比 Carson带你学序列化:深入分析JSON多种解析方式(Gson、AS自带org.json、Jackson)

Carson带你学序列化:深入分析JSON多种解析方式(Gson、AS自带org.json、Jackson)

2023-06-13 12:10| 来源: 网络整理| 查看: 265

前言 现今最主流的数据交换格式 非 JSON莫属 今天,我将全面介绍 JSON & 解析方式(Gson、AS自带org.json、Jackson),希望你们会喜欢

关于另外1种主流的数据传输格式 XML,具体请看:Carson带你学序列化:深入分析XML多种解析方式(DOM、SAX、PULL)

目录 示意图 1. 简介 示意图 2. 语法 1个JSON文件里含多个数据,这些数据 以 JSON值 的形式 存在 // JSON实例 {"skill":{ "web":[ { "name":"html", "year":"5" }, { "name":"ht", "year":"4" }], "database":[ { "name":"h", "year":"2" }] `}} 1个JSON值的内容形式可以是:”名称 - 值“对、数组 或 对象,下面将详细说明 示意图 3. 解析方式

Android 解析 JSON数据的方式 类似 XML解析,主要分为2大类:

示意图

下面,我将详细介绍每种方式

3.1 Android Studio自带org.json解析 解析原理:基于文档驱动

类似于XML的DOM解析方式

解析流程:把全部文件读入到内存中 ->> 遍历所有数据 ->> 根据需要检索想要的数据 具体使用 // 创建需解析的JSON数据:student.json // 将该文件放入到本地assets文件夹里 { "student":[ {"id":1,"name":"小明","sex":"男","age":18,"height":175}, {"id":2,"name":"小红","sex":"女","age":19,"height":165}, {"id":3,"name":"小强","sex":"男","age":20,"height":185} ], "cat":"it" } // 具体解析 import android.os.Bundle; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EntityStudent student = new EntityStudent(); try { //从assets获取json文件 InputStreamReader isr = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("assets/" + "student.json")); //字节流转字符流 BufferedReader bfr = new BufferedReader(isr); String line ; StringBuilder stringBuilder = new StringBuilder(); while ((line = bfr.readLine())!=null){ stringBuilder.append(line); }//将JSON数据转化为字符串 JSONObject root = new JSONObject(stringBuilder.toString()); //根据键名获取键值信息 System.out.println("root:"+root.getString("cat")); JSONArray array = root.getJSONArray("student"); for (int i = 0;i < array.length();i++) { JSONObject stud = array.getJSONObject(i); System.out.println("------------------"); System.out.print("id="+stud.getInt("id")+ ",")); System.out.print("name="+stud.getString("name")+ ",")); System.out.print("sex="+stud.getString("sex")+ ",")); System.out.print("age="+stud.getInt("age")+ ",")); System.out.println("height="+stud.getInt("height")+ ",")); bfr.close(); isr.close(); is.close();//依次关闭流 } } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } } 3.2 Gson解析

Google的开源库

解析原理:基于事件驱动 解析流程:根据所需取的数据 建立1个对应于JSON数据的JavaBean类,即可通过简单操作解析出所需数据 具体使用

步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据) Gson解析的关键 = 根据JSON数据 写出一个对应的JavaBean,规则是:

示意图

下面用2个例子说明 如何通过JSON文档创建JavaBean类

/** * 简单转换 */ // JSON数据1 String json = "{\"id\":1,\"name\":\"小明\",\"sex\":\"男\",\"age\":18,\"height\":175}"; // 对应的JavaBean类 public class EntityStudent { private int id; private String name; private String sex; private int age; private int height; public void setId(int id){ this.id = id; } public void setName(String name){ this.name = name; } public void setSex(String sex){ this.sex = sex; } public void setAge(int age){ this.age = age; } public void setHeight(int height){ this.height = height; } public int getId(){ return id; } public String getName(){ return name; } public String getSex(){ return sex; } public int getAge(){ return age; } public int getHeight(){ return height; } public void show(){ System.out.print("id=" + id + ","); System.out.print("name=" + name+","); System.out.print("sex=" + sex+","); System.out.print("age=" + age+","); System.out.println("height=" + height + ","); } } /** * 复杂转换 */ // JSON数据2(具备嵌套) {"translation":["车"], "basic": { "phonetic":"kɑː", "explains":["n. 汽车;车厢","n. (Car)人名;(土)贾尔;(法、西)卡尔;(塞)察尔"]}, "query":"car", "errorCode":0, "web":[{"value":["汽车","车子","小汽车"],"key":"Car"}, {"value":["概念车","概念车","概念汽车"],"key":"concept car"}, {"value":["碰碰车","碰撞用汽车","碰碰汽车"],"key":"bumper car"}] } // 对应的复杂的JSON数据对应的JavaBean类 public class student { public String[] translation; //["车"]数组 public basic basic; //basic对象里面嵌套着对象,创建一个basic内部类对象 public static class basic{ //建立内部类 public String phonetic; public String[] explains; } public String query; public int errorCode; public List web; //web是一个对象数组,创建一个web内部类对象 public static class wb{ public String[] value; public String key; } public void show(){ //输出数组 for (int i = 0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3