Android中的JSON解析

什么是JSON

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)

  • JSON 是轻量级的文本数据交换格式

  • JSON 独立于语言

  • JSON 具有自我描述性,更易理解

JSON和XML的不同之处

  • 没有结束标签

  • 更短

  • 读写的速度更快

  • 能够使用内建的 JavaScript eval() 方法进行解析

  • 使用数组

  • 不使用保留字

JSON 语法规则

  • 数据在名称/值对中

  • 数据由逗号分隔

  • 花括号保存对象

  • 方括号保存数组

JSON 值可以是

  • 数字(整数或浮点数)

  • 字符串(在双引号中)

  • 逻辑值(true 或 false)

  • 数组(在方括号中)

  • 对象(在花括号中)

  • null

JsonObject处理JSON数据

JsonObject的写

我们可以new一个JSONObject对象,然后通过它的put方法添加数据,添加的数据可以是一个JSONObject,也可以是一个JsonArray,JsonArray也可以通过new JSONArray()创建一个数组对象,然后通过put方法添加内容。

示例代码:

public class MainActivity extends Activity { 

    private List list = new ArrayList(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

        initList(); 

        try { 
            JSONObject root = new JSONObject(); 

            root.put("school", "铁岭中学"); 
            root.put("className", "三年二班"); 

            JSONArray array = new JSONArray(); 
            for (Student student : list) { 
                JSONObject st = new JSONObject(); 
                st.put("id", student.getId()); 
                st.put("name", student.getName()); 
                st.put("age", student.getAge()); 
                st.put("sex", student.getSex()); 
                array.put(st); 
            } 

            root.put("students", array); 

            Log.d("TTTT", root.toString()); 
        } catch (JSONException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 

    } 

    private void initList() { 
        list.add(new Student(1, "张一", 10, "男")); 
        list.add(new Student(2, "张二", 20, "女")); 
        list.add(new Student(3, "张三", 30, "男")); 
        list.add(new Student(4, "张四", 40, "女")); 
        list.add(new Student(5, "张五", 50, "男")); 
        list.add(new Student(6, "张六", 60, "女")); 
    } 
} 

生成的JSON

{ 
    "students": [ 
        { 
            "id": 1, 
            "sex": "男", 
            "age": 10, 
            "name": "张一" 
        }, 
        { 
            "id": 2, 
            "sex": "女", 
            "age": 20, 
            "name": "张二" 
        }, 
        { 
            "id": 3, 
            "sex": "男", 
            "age": 30, 
            "name": "张三" 
        }, 
        { 
            "id": 4, 
            "sex": "女", 
            "age": 40, 
            "name": "张四" 
        }, 
        { 
            "id": 5, 
            "sex": "男", 
            "age": 50, 
            "name": "张五" 
        }, 
        { 
            "id": 6, 
            "sex": "女", 
            "age": 60, 
            "name": "张六" 
        } 
    ], 
    "className": "三年二班", 
    "school": "铁岭中学" 
} 

JsonObject的读

  • 创建一个JSONObject对象,将json字符串传入

  • 通过JSONObject对象的getJSONArray(name)方法获取json字符串中名称为name的数组

  • 通过JSONObject对象的getString(name)方法获取json字符串中名称为name的字符串

  • 通过JSONObject对象的getJSONObject(name)方法获取json字符串中名称为name的对象

示例代码:

public class MainActivity extends Activity { 

    private List list = new ArrayList(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

        try { 
            FileInputStream fis = openFileInput("school.json"); 
            BufferedReader br = new BufferedReader(new InputStreamReader(fis, "gbk")); 
            String line = br.readLine(); 

            StringBuilder sb = new StringBuilder(); 

            while (line != null) { 
                sb.append(line); 
                line = br.readLine(); 
            } 

            fis.close(); 

            JSONObject root = new JSONObject(sb.toString()); 
            String school = root.getString("school"); 
            String className = root.getString("className"); 

            Log.d("TTTT", "学校:" + school + ",班级:" + className); 

            JSONArray array = root.getJSONArray("students"); 
            for (int i = 0; i < array.length(); i++) { 
                JSONObject student = (JSONObject) array.get(i); 
                Log.d("TTTT", "id:" + student.getString("id") + ",name:" + student.getString("name") + ",age:" 
                        + student.getString("age") + ",sex:" + student.getString("sex")); 
            } 

        } catch (FileNotFoundException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } catch (JSONException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
    } 
} 

运行结果

03-28 11:44:10.583: D/TTTT(1640): 学校:铁岭二中,班级:三年二班
03-28 11:44:10.583: D/TTTT(1640): id:1,name:张一,age:10,sex:男
03-28 11:44:10.583: D/TTTT(1640): id:2,name:张二,age:20,sex:女
03-28 11:44:10.583: D/TTTT(1640): id:3,name:张三,age:30,sex:男
03-28 11:44:10.583: D/TTTT(1640): id:4,name:张四,age:40,sex:女
03-28 11:44:10.583: D/TTTT(1640): id:5,name:张五,age:50,sex:男
03-28 11:44:10.583: D/TTTT(1640): id:6,name:张六,age:60,sex:女
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1