笔记37----json和fastjson

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);
在这个例子中,调用JSON.toJSONString方法,把对象o转化为JSON格式的文本。

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"
你可以指定输出日期的格式,比如修改为输出毫秒:JSON.toJSONStringWithDateFormat(date,"yyyy-MM-dd HH:mm:ss.SSS");输出的结果为:"2011-12-18 00:23:07.429"
3)使用WriteClassName特性:
fastjson支持序列化时写入类型信息,从而使得反序列化时不至于类型信息丢失。例如:
Color color = Color.RED;
String text = JSON.toJSONString(color, SerializerFeature.WriteClassName);
System.out.println(text);
输出结果:{"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}
由于序列化带了类型信息,使得反序列化时能够自动进行类型识别,例如:
String text = ...; // {"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}
Color color = (Color) JSON.parse(text);
4)、反序列化就是把JSON格式的文本转化为JavaBean对象
1)指定class信息反序列化
通过指定类型信息,可以很方便的将"JSON文本"反序列化为"Java Bean"对象,例如:
String text = ...; // {"r":255,"g":0,"b":0,"alpha":255}
Color color = JSON.parseObject(text, Color. class );
2)类型集合的反序列化
String text = ...; // [{ ... }, { ... }]
List<User> users = JSON.parseArray(text, User. class );
3)泛型的反序列化
如果你需要返回一个带泛型的对象,例如List<User>、Map<String, User>,你可以使用TypeReference来传入类型信息。
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>>(){});
有时,当你想不起来TypeReference<Map<String, User>>(){}该怎么写时,可以换一种方式:
Map map=new HashMap<String, User>();
map=JSON.parseObject(text, map.getClass());

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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值