一、JSON(JavaScript Object Notation)的定义:
一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。
二、JSON的结构:
(1) Name/Value Pairs(无序):类似于Keyed list、Hash table、Dictionary。在Android平台中同时存在另外一个类"Bundle",也具有相似的行为。
(2) Array(有序):一组有序的数据列表。
对象
对象是一个无序的Name/Value Pairs集合。如{"name":"kirl","num":75}
Array
Array是值(value)的有序集合。值(value)可以是字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。
Array里面包含对象(object) [{"id":75,"name":"kirl"} , {"id":25,"name":"sx"} , ......]
对象(object)中可以包含Array,3个对象,其中1个对象包含1个数组,2个子对象
{
"first":[{"id":1,"name":"kirl"},{"id":2,"name":"sx"}],
"second":75,
"third":true
}
对象嵌套子对象,子对象再嵌套数组
{"root":
{"child":
[
{"id":1,"name":"kirl"},
{"id":2,"name":"sx"}
]
}
}
三、在Android中包含四个与JSON相关的类和一个Exceptions:
JSONObject、JSONArray、JSONStringer、JSONTokener、JSONException
(1)JSONObject:
这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。
toString()方法输出的数值为 {"KIRL":"Test"},初始化一个JSONObject实例,引用put()方法添加数值:new JSONObject().put("KIRL","Test")。
Value的类型包括:Boolean、JSONArray、JSONObject、String等。
两个不同的取值方法:
get() : 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception消息。
opt() : 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。
(2) JSONArray:
它代表一组有序的数值,格式如[value1,value2,value3]。其方法与JSONObject类似。
(3) JSONStringer:
这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。
- String myString = new JSONStringer().object()
- .key("name")
- .value("kirl").endObject().toString();
- System.out.println(myString);
输出结果是一组标准格式的JSON text : {"name":"kirl"}
其中的.object()和.endobject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。
(4) JSONTokener:
这个是为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string中提取数值信息。
(5) JSONException:
为JSON.org类抛出的异常信息。
四、详细示例:
- import org.json.*;
- import java.util.*;
- public class TestJson {
- /**
- * 获取"数组形式"的JSON数据,
- * 数据形式:[{"id":1,"name":"kirl"},{"id":2,"name":"sx"}]
- * @param myJson 数值内容
- * @throws Exception
- */
- public static void getJSONArray(String myJson) throws Exception
- {
- System.out.println("getJSONArray");
- //数据直接为一个数组形式,所以可以直接用Android提供的框架JSONArray读取JSON数据,转换成Array
- JSONArray jsonArray = new JSONArray(myJson);
- for(int i = 0;i < jsonArray.length();i++)
- {
- //每条记录又由几个Object对象组成
- JSONObject item = jsonArray.getJSONObject(i);
- //获取对象的内容
- int id = item.getInt("id");
- String name = item.getString("name");
- System.out.println("id->" + id);
- System.out.println("name->" + name);
- }
- }
- /**
- * 获取"对象形式"的JSON数据,
- * 数据形式:{"first":75,"second":true,"third":[{"id":1,"name":"kirl"},{"id":2,"name":"sx"}]}
- * @param myJson
- * @throws Exception
- */
- public static void getJSONObject(String myJson) throws Exception
- {
- System.out.println("getJSONObject");
- //返回的数据是一个Object类型,所以可以直接转换成一个Object
- JSONObject jsonObject = new JSONObject(myJson);
- int first = jsonObject.getInt("first");
- Boolean second = jsonObject.getBoolean("second");
- System.out.println("first->" + first);
- System.out.println("second->" + second);
- //数组数据用getJSONArray获取数组
- JSONArray jsonArray = jsonObject.getJSONArray("third");
- for(int i = 0;i < jsonArray.length();i++)
- {
- //得到每个对象
- JSONObject item = jsonArray.getJSONObject(i);
- //获取对象对应的值
- int id = item.getInt("id");
- String name = item.getString("name");
- System.out.print("third->");
- System.out.print("id->" + id);
- System.out.println(",name->" + name);
- }
- }
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- String json = "[{\"id\":1,\"name\":\"kirl\"},{\"id\":2,\"name\":\"sx\"}]";
- getJSONArray(json);
- json = "{\"first\":75,\"second\":true,\"third\":[{\"id\":1,\"name\":\"kirl\"},{\"id\":2,\"name\":\"sx\"}]}";
- getJSONObject(json);
- }
- }
输出结果为:
getJSONArray
id->1
name->kirl
id->2
name->sx
getJSONObject
first->75
second->true
third->id->1,name->kirl
third->id->2,name->sx
转载于:https://blog.51cto.com/kirl75/1090298