目录
1.使用JSONObject类与JSONArray类解析JSON数据
2.程序中创建 JSONObject / JSONArray
Android应用程序界面上的数据信息大部分都是通过网络请求从服务器上获取到的,获取到的数据类型常见的就是JSON。JSON是一种新的数据格式,这种格式的数据不可以直接显示到程序的界面上,需要将该数据解析为一个集合或对象的形式才可以显示到界面上。JSON的全称为JavaScript Obiect Notation,JSON表示一种轻量级的数据交互格式,它是基于JavaScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而且USON数据易于阅读和编写,同时也易于机器解析和生成,能够有效地提升网络的传输效率。
初学者可以使用JSON传输一个简单的数据,如String、Number、Boolean类型的数据,也可以传输一个数组或者一个复杂的Object对象。
JSOU数据有两种表示结构,对象结构和数组结构。
对象结构的JSON数据以" { "开始,以" } "结束。中间部分由以“ , “分隔的键值对 ( key : value )构成最后一个键值对后边不用加" , "、键(keg)和值(value)之间以" : "分隔。

基本语法格式:
- {
- "key1": value1,
- "key2": value2,
- "key3": value3,
- ... ...
- }
例:
- {
- "city": "北京",
- "street": "xiSanQi",
- "number": 100096,
- "inWest":true
- }
数组结构的ISON数据以" [ "开始,以" ] "结束。中间部分由0个或多个以" , "分隔的对象(value)的列表组成。

基本语法格式:
- [
- value1,
- value2,
- value3,
- ... ...
- ]
例:
(1)
- [
- "abc",
- 123,
- true,
- null
- ]
(2)
本数组结构JSON中含两个对象结构JSON
- [
- {
- "name": "王欣",
- "sex": "女"
- },
- {
- "name": "王梓",
- "sex": "女"
- }
- ]
(3)
本数组结构JSON中含两个对象结构JSON,对象结构JSON中含一个数组结构JSON
- [
- {
- "name": "王欣",
- "sex": "女",
- "hobby": ["篮球","音乐","足球"]
- },
- {
- "name": "王梓",
- "sex": "女",
- "hobby": ["电影","游泳","羽毛球"]
- }
- ]
假设有两条JSON数据,json1和json2
- json1: { "name":"张三" , "age":27 , "married":true }
- json2: [ { "name":"李四" , "age":25 } , { "name":"王五" , "age":20 } ]
使用方法 new JSONObject( " 字符串型JSON " ) 获取JSONObject对象,然后使用optXXX(String valueName)方法获取JSON所含值,这种方法是安全的,opt方法遇到空字段返回默认值(空字符,false,0);如使用getXXX(String valueName)方法获取JSON所含值,get方法在遇到空数据时抛出异常。
- //根据字符串型的JSON信息获取JSONObject
- JSONObject jsonObject=new JSONObject( "json1(字符串类型)" );
- //获取内容值
- String jsonName=jsonObject.optString("name");
- int jsonAge=jsonObject.optInt("age");
- boolean jsonMarried=jsonObject.optBoolean("married");
使用方法 new JSONArray( " 字符串型JSON " ) 获取JSONArray对象,然后使用getJSONObject(int index)方法获取JSONObject对象,然后使用optXXX(String valueName)方法获取JSON所含值,这种方法是安全的,opt方法遇到空字段返回默认值(空字符,false,0);如使用getXXX(String valueName)方法获取JSON所含值,get方法在遇到空数据时抛出异常。
- //根据字符串型的JSON信息获取JSONArray
- JSONArray jsonArray=new JSONArray( "json2(字符串类型)" );
- //获取数组结构JSON中所含的各个对象结构JSON
- for (int i=0;i
- //获取当前指针的
- JSONObject jsonObject=jsonArray.getJSONArray(i);
- //获取内容值对象结构JSON
- String jsonName=jsonObject.optString("name");
- int jsonAge=jsonObject.optInt("age");
- }
以上两个类在解析JSON数据时用到了optString()方法,optInt()方法,optBoolean()方法,这些方法在解析数据结构是安全的,如果对应的字段不存在,这些方法会有默认的返回值。
2.使用GSON库解析JSON数据
Google公司提供了一个Gson库用于解析JSON数据,使用前需将其添加到项目中。
使用Gson前要创建JOSN数据对应的实体类,实体类中的成员名称必须与JSON数据中key值一致。
- //在清单文件中引入依赖
- implementation 'com.google.code.gson:gson:2.8.8'
例:
- //自定义类
- class Person{
- private String name;
- private int age;
- private boolean married;
-
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- public boolean getMarried() {
- return married;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setMarried(boolean married) {
- this.married = married;
- }
- }
(1)解析对象结构JSON
创建Gson对象;然后使用Gson类.fromJSON()方法,创建自定义类Person对象。
- //创建Gson对象
- Gson gson=new Gson();
- //使用Gson类.fromJSON()方法,创建自定义类Person对象
- Person1 person1=gson.fromJSON( "json1(字符串类型)" , Person.class );
(2)解析数组结构JSON(其中包含对象结构JSON)
创建Gson对象;使用new TypeToken>(){}.getType()
(类型代币)创建Type对象;然后使用Gson类.fromJSON()方法,创建自定义类的List集合(List)。
- //创建Gson对象
- Gson gson=new Gson();
- //创建Type对象
- Type listType=new TypeToken
>(){}.getType();
- //使用Gson类.fromJSON()方法,创建自定义类的List集合(List
) - List
list=gson.formJSON( "json2(字符串类型)" , listType );
三、获取JSONObject、JSONArray对象
1.文件中获取
可使用输入流与StringBuilder配合,依靠StringBuilder生成完整的字符串型JSON数据。
- //创建文件输入流
- InputStream inputStream=openFileInput(" ~ .json");//从该程序私有文件读取
- InputStream inputStream=getResources().openRawResource(R.raw.myjson);//raw文件获取
-
- BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
- //创建字符串构建器
- StringBuilder stringBuilder=new StringBuilder();
- while (true){
- String tempStr=bufferedReader.readLine();
- if(tempStr!=null){
- stringBuilder.append(tempStr);
- }
- else {
- break;
- }
- }
- //字符串构建器创建字符串
- String jsonString=stringBuilder.toString();
-
- //生成JSONObject或JSONArray对象
- JSONObject jsonObject=new JSONObject(jsonString);
- JSONArray jsonArray=new JSONArray(jsonString);
2.服务器返回数据中获取
多数服务器返回JSON数据
- //Response(响应)为服务器返回
- Response response;
- //获取ResponseBody
- ResponseBody responseBody=response.body();
- String jsonString=responseBody.toString();
- //生成JSONObject或JSONArray对象
- JSONObject jsonObject=new JSONObject(jsonString);
- JSONArray jsonArray=new JSONArray(jsonString);
四、创建JSON数据
1.创建 .json 文件
res -> [new] -> [Android Resource Directory] -> Resource type : raw ->raw-> [new] -> [File] 文件后缀为.json
main -> [new] -> [ Folder ] -> [Assets Folder] -> main -> assets -> [new] -> [File] 文件后缀为.json
2.程序中创建 JSONObject / JSONArray
- //创建JSONObject
- JSONObject jsonObject=new JSONObject();
- jsonObject.put("id","1");
- jsonObject.put("name","王欣");
-
- //创建JSONArray
- JSONArray jsonArray=new JSONArray();
- jsonArray.put("王欣");
- jsonArray.put("王梓");