什么是JSON?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。
Json与XML的比较
XML的结构:倒立的树形结构
<people>
<person id="1">
<name>张三</name>
<age>20</age>
<gender>男</gender>
</person>
<peson id="2">
<name>李四</name>
<age>25</age>
<gender>女</gender>
</person>
</people>
Json的结构:
{
people:[
{ "id" : "123", "name" : "张三", "age" : "20", "gender" : "男" } ,
{ "id" : "456", "name" : "李四", "age" : "25", "gender" : "女" } ,
]
};
与Json有关的三种数据类型
第一种数据类型:标量(scalar),也就是一个单数的字符串(string)或者数字(numbers),比如”北京”这个单独的词.
第二种数据类型:序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫数组(array)或者列表(list),比如”北京,上海”.
第三种数据类型:映射(mapping),也就是一个名/值对(name/value),即数据有一个名称,还有一个相对应的值,这又称作散列(hash)或者字典(dictionary),比如”首都: 北京”
Json的优点和缺点
优点:
1.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小.
2.支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript.Perl.PHP.Python,Ruby等服务器端语言,便于服务器端的解析.
缺点:
1.要求字符集,必须是Unicode,受约束性强.否则会产生空或者乱码。
2.语法过于严谨,必须遵循json语法的四分原则.
Json的语法规则
JSON就是一串字符串 只不过元素会使用特定的符号标注。
1、{} 双括号表示对象 - JsonObject
2、[] 中括号表示数组(对象的集合) - JsonArray
3、"" 双引号内是属性或值
4、: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
5、并列的数据之间用逗号(“,”)分隔
JSON基于两种结构:
1、JsonObject
JsonObject的数据是用 { } 来表示的,JsonObject可以包含有JsonArray。
例如:
{ "id" : "123", "name" : "张三", "age" : "20", "gender" : "男" } ;
{
data:[
{ "id" : "123", "name" : "张三", "age" : "20", "gender" : "男" } ,
{ "id" : "456", "name" : "李四", "age" : "25", "gender" : "女" } ,
]
};
2、JsonArray
顾名思义是由JsonObject构成的数组,用 [ { } , { } , ...... , { } ] 来表示
例如: 表示了包含2个JSONObject的JSONArray。可以看到一个很明显的区别,一个用的是 { } ,一个最外面用的是 [ ]
[
{ "id" : "123", "name" : "张三", "age" : "20", "gender" : "男" } ,
{ "id" : "456", "name" : "李四", "age" : "25", "gender" : "女" } ,
]
3、如何从字符串String获得JSONObject对象和JSONArray对象
JsonObject jsonObject = new JsonObject ( String str);
JsonArray jsonArray = new JsonArray(String str ) ;
或者使用Google的Gson类
JsonObject jsonObject = gson.fromJson(str, JsonObject.class)
JsonArray jsonArray = gson.fromJson(str, JsonArray.class)
4、如何从JsonArray中获得JsonObject对象
大家可以把JsonArray当成一般的数组来对待,只是获取的数据内数据的方法不一样
JsonObject jsonObject = (JsonObject)jsonArray.get(i);
JsonObject jsonObject = jsonArray.getJsonObject(i) ;
两者都可。第一种注意转换
5、如何从中JsonObject获得JsonArray对象
从jsonObject中获取名为 "data" 的 jsonArray
JsonArray jsonArray=jsonObject.getAsJsonArray("data");
以上述例子为结果,可以得到处理后的数据
[
{ "id" : "123", "name" : "张三", "age" : "20", "gender" : "男" } ,
{ "id" : "456", "name" : "李四", "age" : "25", "gender" : "女" } ,
]
依据上一步骤得到的jsonArray,获取其中一个JsonObject
JsonObject jsonObject = (JsonObject)jsonArray.get(0);
结果如下:
{ "id" : "123", "name" : "张三", "age" : "20", "gender" : "男" } ,
6、转换成对象
将json转换成POJO类,单个:
Person person = gson.fromJson(json, Person.class);
多个:
List<Person> people = gson.fromJson(json,new TypeToken<List<Person>>() {}.getType()));
7、对象转换成json
List<Object> 转换成 json
List<Object> results = new List<Object>;
Gson gson = new Gson();
String str = gson.toJson(results);
JSONArray jsonArray = JSONArray.parseArray(str);