1、json概念
一种轻量级的数据交换格式,适用于多种平台。在Android中,被广泛用于客户端和服务器通信,在网络数据传输和解析时非常方便。
2、与xml比较
1)json和xml的数据可读性差不多。2)json和xml同样拥有丰富的解析手段。3)json相对于xml来讲,数据体积更小。4)json与javascript的交互更方便。5)json对数据的描述性比xml差。6)json的速度要远远快于xml。
2、json使用
1)json语法
语法规则:花括号保存对象,方括号保存数组,数据保存在名值对中,数据由逗号分隔。
记好语法,都不是问题。举几个例子:
{"firstName":"Brett"}--------对象(仅有一个数据)
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}----------对象(有多个数据)
[ { "precision": "zip", "Latitude": 37.7668, "Longitude": -122.3959, "Address": "", "City": "SAN FRANCISCO", "State": "CA", "Zip": "94107", "Country": "US" },
{ "precision": "zip", "Latitude": 37.371991, "Longitude": -122.026020, "Address": "", "City": "SUNNYVALE", "State": "CA", "Zip": "94085", "Country": "US" }]
-----------------数组(数组元素是包含多个数据的对象)
{"programmers":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
],
"authors":[
{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}
],
"musicians":[
{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},
{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}
]}---------对象(对象值是数组)
2)json结构
json基础结构只有两种:对象和数组
3)常用的类
①JSONObject:json对象;②JSONArray:json数组;③JSONStringer:这个类帮助快速和便捷的创建JSONtext。最大优点在于可以减少由于格式的错误导致程序异常。④JSONTokener:这个是系统为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string中提取数值信息。⑤JSONException
4、开源框架fastjson
1)、了解
解析速度最快,支持各种JDK类型,包括基本类型、JavaBean、Collection、Map、Enum、泛型等。
2)、序列化和反序列化
一个json库涉及的最基本功能就是序列化和反序列化。可以使用com.alibaba.fastjson.JSON这个类进行序列化和反序列化。
3)、序列化就是把JavaBean对象转化为JSON格式的文本。
1)基本序列化:
Object o = ...;
String text = JSON.toJSONString(o);
2)日期格式化:
fastjson直接支持日期类型数据的格式化,包括java.util.Date、java.sql.Date、java.sql.Timestamp、java.sql.Time。缺省情况下,fastjson将Date类型序列化为long,这个使得序列化和反序列化的过程不会导致时区问题。如:
long
millis = 1324138987429L;
Date date =
new
Date(millis);
System.out.println(JSON.toJSONString(date));输出结果是1324138987429
fastjson还提供了基于格式化输出的SerializerFeature,例如:JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat);
输出的结果为:"2011-12-18 00:23:07"
3)使用WriteClassName特性:
fastjson支持序列化时写入类型信息,从而使得反序列化时不至于类型信息丢失。例如:
Color color = Color.RED;
String text = JSON.toJSONString(color, SerializerFeature.WriteClassName);
System.out.println(text);
输出结果:
String text = ...;
// {"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}
Color color = (Color) JSON.parse(text);
4)、反序列化就是把JSON格式的文本转化为JavaBean对象
String text = ...;
// {"r":255,"g":0,"b":0,"alpha":255}
Color color = JSON.parseObject(text, Color.
class
);
String text = ...;
// [{ ... }, { ... }]
List<User> users = JSON.parseArray(text, User.
class
);
String text = ...;
// {"name":{"name":"ljw",age:18}}
Map<String, User> userMap = JSON.parseObject(text,
String text = ...;
// {"name":{"name":"ljw",age:18}}
Map<String, User> userMap = JSON.parseObject(text,
new
TypeReference<Map<String, User>>() {});
<Map<String, User>>(){});
|
5、解析注意事项
从服务器得到的数据一般为{"body":值},此时要解析
1)当值为100、102之类的数字时,不能通过强制转换将返回值转为String型,但可以通过在值后+""来转为字符串。
2)当值为null时,注意此时只是表示body的值为字符串"null",而非我们常用的null。注意区分"null"和null
3)解析举例:看下图json数据
要解析这种数据,先看格式:都是键值对的json对象。区别是SpecName1和SpecName2的类型是String,GoodsSpecs的类型是List<对象>。
首先将0、1、2声明成类,如SubTClass。
然后再声明一个类,如
class TClass{
private String SpecName1, SpecName2;
private List<SubTClass> GoodsSpecs;
get和set方法
}
然后直接解析就OK了。