Android手动创建和解析Json

概述

现在Android开发中创建和解析Json大都是利用Gson、fastJson等可以映射对象的第三方库,确实非常方便,使用Gson解析可以参考我的另一篇文章使用Gson解析和创建json, 但是还是有需要手动解析的情况。本文详细介绍了不使用第三方库,直接使用Android自带的JsonObject等类来创建和解析json,并准备了一个小Demo.

 

1 json的格式介绍

1.1 json对象

{"name": "jadyli", "gender": "male"}

1

对象表示为键值对,数据由逗号分隔,花括号保存对象,使用双引号包裹键名,使用冒号分隔键和值。如果值是String类型且含有双引号或冒号,需要使用”\”转义。

 

1.2 json数组

[
    {"name": "jadyli", "gender": "male"},
    {"name": "sanqi", "gender": "male"}
]

 

方括号保存数组。

 

2 Android自带的Json操作类

2.1 JSONObject

2.1.1 JSONObject基本介绍

Android官方的介绍是

 

A modifiable set of name/value mappings. Names are unique, non-null strings. Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL. Values may not be null, NaNs, infinities, or of any type not listed here.

 

一个可变更的键值对映射集合。键是唯一的,非空的字符串。值可能是JSONObjects,JSONArrays,Strings,Booleans,Integers,Longs,Double或NULL中的任意组合。值也有可能不是null,NaNs,infinities,或者任意的这里没有列举的类型。

 

一些常用的方法如下,参考Android JSONObject类

 

方法名(参数) 描述

get(String name) 返回跟键映射的值,如果没找到则抛出异常

getInt(String name) 返回int值,如果没找到则抛出异常

getString(String name) 返回String值,如果没找到则抛出异常

opt(String name) 返回跟键映射的值,如果没找到则返回null

optString(String name, String fallback) 返回跟键映射的值,如果没找到则返回方法参数中fallback

optString(String name) 返回跟键映射的值,如果没找到则返回空字符串”“

put(String name, Object value) 将键映射到值,如果这个对象中存在这个键则会覆盖之前的

put(String name, int value) 将键映射到值,如果这个对象中存在这个键则会覆盖之前的

getJSONObject(String name) 返回JSONObject,如果没找到则抛出异常

getJSONArray(String name) 返回JSONArray值,如果没找到则抛出异常

keys() 返回Iterator,这个对象中键的集合迭代器

names() 返回JSONArray,这个对象中键的数组

length() 返回这个对象中数据条数

has(String name) 判断这个对象中是否有这个键的映射

isNull(String name) 判断这个对象中是否有这个键的映射,或者判断值为NULL

toString() 将这个对象转成json串,比如:{“query”:”Pizza”,”locations”:[94043,90210]}

toString(int indentSpaces) 将这个对象转成json串,显示上会增加换行和缩进,方便阅读

可以调用JSONObject()构造方法,创建一个空的JSONObject,也可以调用JSONObject(String json),将json字符串传入。

 

2.1.2 JSONObject实例

运用上面的方法,已经可以解析和创建一般的json字符串了。以这个json字符串为例。

 

{"name": "jadyli", "gender": "male", "age": 18}

1

创建json

JSONObject jsonObject = new JSONObject();

jsonObject.put("name", "jadyli");

jsonObject.put("gender", "male");

jsonObject.put("age", 18);

System.out.println(jsonObject.toString(1));

输出

 

{“name”:”jadyli”,”gender”:”male”,”age”:18}

 

解析json

String json = "{\"name\": \"jadyli\", \"gender\": \"male\", \"age\": 18}";

JSONObject jsonObject = new JSONObject(json);

System.out.println("姓名:" + jsonObject.getString("name"));

System.out.println("性别:" + jsonObject.getString("gender"));

System.out.println("年龄:" + jsonObject.getString("age"));

 

2.2 JSONArray

参考JSONArray

JSONArray的方法和JSONObject基本一致。举个JSONObject和JSONArray同时使用的小例子。

{

  "students": [

    {

      "name": "jadyli",

      "gender": "male",

      "age": 18

    },

    {

      "name": "Juliet",

      "gender": "female",

      "age": 20

    }

  ]

}

 

创建json

String[] names = {"jadyli", "Juliet"};

String[] genders = {"male", "female"};

int[] ages = {18, 20};

JSONArray students = new JSONArray();

for (int i = 0; i < names.length; i++) {

    JSONObject student = new JSONObject();

    student.put("name", names[i]);

    student.put("gender", genders[i]);

    student.put("age", ages[i]);

    students.put(student);

}

JSONObject jsonObject = new JSONObject();

jsonObject.put("students", students);

System.out.println(jsonObject.toString(1));

 

输出

 

{“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}

 

解析json

String json = "{"students":[{"name":"jadyli","gender":"male","age":18},

                         {"name":"Juliet","gender":"female","age":20}]}";

JSONObject jsonObject = new JSONObject(json);

JSONArray students = jsonObject.getJSONArray("students");

for (int i = 0; i < students.length(); i++) {

     JSONObject student = students.getJSONObject(i);

     System.out.println("姓名:" + student.getString("name"));

     System.out.println("性别:" + student.getString("gender"));

     System.out.println("年龄:" + student.getInt("age") + "\n");

}