JSONObject, JSONArray来构建json文本
getType和optType api的使用
除了上面的两个类,还可以使用JSONStringer来构建json文本
json文本解析类JSONTokener
按照RFC4627规范将json文本解析为相应的对象。
对于将json文本解析为对象,只需要用到该类的两个api:
构造函数
public Object nextValue();
- //
假设现在要创建这样一个json文本 - //
{ - //
"phone" : ["12345678", "87654321"], // 数组 - //
"name" : "yuanzhifei89", // 字符串 - //
"age" : 100, // 数值 - //
"address" : { "country" : "china", "province" : "jiangsu" }, // 对象 - //
"married" : false // 布尔值 - //
} -
- try
{ -
// 首先最外层是{},是创建一个对象 -
JSONObject person = new JSONObject(); -
// 第一个键phone的值是数组,所以需要创建数组对象 -
JSONArray phone = new JSONArray(); -
phone.put("12345678").put("87654321"); -
person.put("phone", phone); -
-
person.put("name", "yuanzhifei89"); -
person.put("age", 100); -
// 键address的值是对象,所以又要创建一个对象 -
JSONObject address = new JSONObject(); -
address.put("country", "china"); -
address.put("province", "jiangsu"); -
person.put("address", address); -
person.put("married", false); - }
catch (JSONException ex) { -
// 键为null或使用json不支持的数字格式(NaN, infinities) -
throw new RuntimeException(ex); - }
getType和optType api的使用
getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException
optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值
- try
{ -
// 所有使用的对象都是用上面创建的对象 -
// 将第一个电话号码转换为数值和将名字转换为数值 -
phone.getLong(0); -
person.getLong("name"); // 会抛异常,因为名字无法转换为long -
phone.optLong(0); // 代码内置的默认值 -
phone.optLong(0, 1000); // 用户提供的默认值 -
person.optLong("name"); -
person.optLong("name", 1000); // 不像上面那样抛异常,而是返回1000 - }
catch (JSONException ex) { -
// 异常处理代码 - }
除了上面的两个类,还可以使用JSONStringer来构建json文本
- try
{ -
JSONStringer jsonText = new JSONStringer(); -
// 首先是{,对象开始。object和endObject必须配对使用 -
jsonText.object(); -
-
jsonText.key("phone"); -
// 键phone的值是数组。array和endArray必须配对使用 -
jsonText.array(); -
jsonText.value("12345678").value("87654321"); -
jsonText.endArray(); -
-
jsonText.key("name"); -
jsonText.value("yuanzhifei89"); -
jsonText.key("age"); -
jsonText.value(100); -
-
jsonText.key("address"); -
// 键address的值是对象 -
jsonText.object(); -
jsonText.key("country"); -
jsonText.value("china"); -
jsonText.key("province"); -
jsonText.value("jiangsu"); -
jsonText.endObject(); -
-
jsonText.key("married"); -
jsonText.value(false); -
-
// },对象结束 -
jsonText.endObject(); - }
catch (JSONException ex) { -
throw new RuntimeException(ex); - }
json文本解析类JSONTokener
按照RFC4627规范将json文本解析为相应的对象。
对于将json文本解析为对象,只需要用到该类的两个api:
构造函数
public Object nextValue();
- //
{ - //
"phone" : ["12345678", "87654321"], // 数组 - //
"name" : "yuanzhifei89", // 字符串 - //
"age" : 100, // 数值 - //
"address" : { "country" : "china", "province" : "jiangsu" }, // 对象 - //
"married" : false // 布尔值 - //
} -
- private
static final String JSON = - "{"
+ -
" \"phone\" : [\"12345678\", \"87654321\"]," + -
" \"name\" : \"yuanzhifei89\"," + -
" \"age\" : 100," + -
" \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," + -
" \"married\" : false," + - "}";
-
- try
{ -
JSONTokener jsonParser = new JSONTokener(JSON); -
// 此时还未读取任何json文本,直接读取就是一个JSONObject对象。 -
// 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String) -
JSONObject person = (JSONObject) jsonParser.nextValue(); -
// 接下来的就是JSON对象的操作了 -
person.getJSONArray("phone"); -
person.getString("name"); -
person.getInt("age"); -
person.getJSONObject("address"); -
person.getBoolean("married"); - }
catch (JSONException ex) { -
// 异常处理代码 - }
其它的api基本就是用来查看json文本中的文本的