一、JSON解析
(一)、两种结构
1、对象:对象在js中表示为“{}”扩起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构
2、数组:数组在js中是中括号“[]”扩起来的内容,数据结构为 ["java","javascript","vb",...]
(二)、相关类
1、JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值
a、toString() :输出一个标准的JSON字符串 如:{"query":"Pizza","locations":[94043,90210]}
b、put():添加值 如:new JSONObject().put("JSON", "Hello, World!")
c、get()、getString()、getInt() <---optType同理--> :得到数据
2、JSONArray:它代表一组有序的数值,对应数据结构的数组
a、get()和opt()两种方法都可以通过index索引返回指定的数值
b、put()方法用来添加或者替换数值
3、JSONStringer:json文本构建类,这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照 JSON语法规则(syntax rules)创建JSON text。
如:
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("xinqing");
jsonText.key("age");
jsonText.value(100);
jsonText.key("address");
// 键address的值是对象
jsonText.object();
jsonText.key("country");
jsonText.value("china");
jsonText.key("province");
jsonText.value("shanghai");
jsonText.endObject();
jsonText.key("married");
jsonText.value(false);
//},对象结束
jsonText.endObject();
System.out.println("jsonText = " + jsonText.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
4、JSONTokener:按照RFC4627规范将json文本解析为相应的对象,可用于对JSON的定位与查找
a、nextValue()配合get()方法,获取对象
如:
String JSONstr = //多个""之前加上"\"以防冲突
"{" +
" \"phone\" : [\"12345678\", \"87654321\"]," +
" \"name\" : \"yuanzhifei89\"," +
" \"age\" : 100," +
" \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +
" \"married\" : false," +
"}";
try {
JSONTokener jsonParser = new JSONTokener(JSONstr);
JSONObject person = (JSONObject) jsonParser.nextValue();
// 接下来的就是JSON对象的操作了
person.getJSONArray("phone");
person.getString("name");
person.getInt("age");
person.getJSONObject("address");
person.getBoolean("married");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
b、其它用来查看JSON文本中的文本的
如:
try {
JSONTokener jsonParser = new JSONTokener(JSONstr);
// 继续向下读8个json文本中的字符。此时刚开始,即在{处
jsonParser.next(8); //"phone tab算一个字符
jsonParser.next(); //"
// 继续向下读取一个json文本中的字符。该字符不是空白、同时也不是注视中的字符
jsonParser.nextClean(); //:
// 返回当前的读取位置到第一次遇到'a'之间的字符串(不包括a)。
jsonParser.nextString('a'); // ["12345678", "87654321"], "n(前面有两个空格)
// 返回当前读取位置到第一次遇到字符串中(如"0089")任意字符之间的字符串,同时该字符是trimmed的。(此处就是第一次遇到了89)
jsonParser.nextTo("0089"); //me" : "yuanzhifei
// 读取位置撤销一个
jsonParser.back();
jsonParser.next(); //i
// 读取位置前进到指定字符串处(包括字符串)
jsonParser.skipPast("address");
jsonParser.next(8); //" : { "c
// 读取位置前进到执行字符处(不包括字符)
jsonParser.skipTo('m');
jsonParser.next(8); //married"
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
另,使用Google的GSON框架