fastjson使用心得
2015-11-20 16:36
801 查看
喜欢fastjson,因为只需要依赖JDK,其他环境都不需要依赖就可以使用。而且它非常的快。这里我也把使用它的一些感悟和总结写出来,供大家指正。
说到fastjson,我们就要懂得一个概念就是序列化:将对象信息转换为可以传输和存储的信息【百度百科】
我们不需要一个字段的时候我们可以通过@JSONFiled(serialize=false) 来不序列化,默认JSONFiled类里面serialize和deserialize都是true
@JSONFiled()里面有很多参数可以去设置,比如时间的类型@JSONFiled(format="yyyyMMdd HHmmss"),也可以指定在序列化时的名字。
fastjson还有一个优点就是和java中的实体类有很好的融合。我们定义好的实体类。然后我们在返回给前端使用的时候,有一些字段我们是不需要或者前端不要求提供的。所以我们可以用过滤器把它过滤掉。
当我们按顺序输出相关的列,我们可以在输出的model类中加入注解@JSONField(ordinal=0) .. 如下:
另外我们在持有对象的时候需要返回相关信息,就会解析错误,比如解析成$ref这样的对象类型,我们就可以在解析的时候做一些处理(加了红色的标注部分),如下:
还有一些不经常使用的类库,其实功能还是比较强大,JSONPath:
我们想解析把 t 解析成一个对象,使用如下的方式:
当然省略一下中间的步骤也是可以的,可以用下面更好的方式:
{
"ID": 515697,
"chargeFree": 0,
"commentCount": 0,
"confidence": "30"
}
可以通过下面的代码进行字符串转成对象操作:
就可以把上面的 t 转换成一个List了,然后就可以操作啦
另外我们可以让Chrome浏览器加载一个JSON的识别插件 项目地址:https://github.com/gildas-lormeau/JSONView-for-Chrome , 下载好后解压,加载已解压的程序的时候定位到WebContent 就可以了。
说到fastjson,我们就要懂得一个概念就是序列化:将对象信息转换为可以传输和存储的信息【百度百科】
我们不需要一个字段的时候我们可以通过@JSONFiled(serialize=false) 来不序列化,默认JSONFiled类里面serialize和deserialize都是true
@JSONFiled()里面有很多参数可以去设置,比如时间的类型@JSONFiled(format="yyyyMMdd HHmmss"),也可以指定在序列化时的名字。
@Id @Column(name = "id") @JSONField(name = "ID") @GeneratedValue(strategy= GenerationType.IDENTITY) public int getId() { return id; }比如我们在上面指定序列化后名字为“ID”。
fastjson还有一个优点就是和java中的实体类有很好的融合。我们定义好的实体类。然后我们在返回给前端使用的时候,有一些字段我们是不需要或者前端不要求提供的。所以我们可以用过滤器把它过滤掉。
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(FundEntity.class,"ID","contractContent","fixtureTime","contractContent","typeName","dealMark","transactionAmount");
return JSON.toJSONString(new BaseModel(Constants.SUCCESS_CODE,fundLists2),filter);这样返回的字段就是我们Filter里面定义的规定字段。
当我们按顺序输出相关的列,我们可以在输出的model类中加入注解@JSONField(ordinal=0) .. 如下:
@JSONField(ordinal = 0) private String code; @JSONField(ordinal = 1) private Map<String,String> myGroup; @JSONField(ordinal = 2) private Map<String,String> addGroup;
另外我们在持有对象的时候需要返回相关信息,就会解析错误,比如解析成$ref这样的对象类型,我们就可以在解析的时候做一些处理(加了红色的标注部分),如下:
return JSON.toJSONString(new BaseModel(Constants.SUCCESS_CODE,resultList),filter,<strong><span style="color:#ff0000;">SerializerFeature.DisableCircularReferenceDetect</span></strong>);
还有一些不经常使用的类库,其实功能还是比较强大,JSONPath:
package ms.fastjson; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONPath; public class JSONPathTest { public static void main(String[] args) { List<MyEntity> entities = new ArrayList<MyEntity>(); entities.add(new MyEntity(1001, "ljw1001")); entities.add(new MyEntity(1002, "yan1002")); entities.add(new MyEntity(1003, "asw1003")); entities.add(new MyEntity(1004, null)); /** * 把fastjson当查询来用,不知道这种效率怎么样,比起ID查询来看 * [id in (1001,1003)] 按特定ID来筛选集合中的元素 * [0,2] 按下标来筛选集合中的元素,返回下标中0和2的元素 * [0:2] 按下标来筛选集合中的元素,返回下标中0-2的元素 * $.name 返回MyEntity中所有的name * */ List<MyEntity> result = (List<MyEntity>)JSONPath.eval(entities, "[id in (1001,1003)]"); List<MyEntity> result1 = (List<MyEntity>)JSONPath.eval(entities, "[0,2]"); List<MyEntity> result2 = (List<MyEntity>)JSONPath.eval(entities, "[0:2]"); List<MyEntity> result3 = (List<MyEntity>)JSONPath.eval(entities, "$.name"); MyEntity myEntity = result.get(0); //System.out.println(result3); MyEntity myEntity2 = new MyEntity(1005,"asd1005","String Object"); String value = (String)JSONPath.eval(myEntity2, "$.value"); System.out.println(value); //是否有value元素 boolean isContain = JSONPath.containsValue(myEntity2, "$.value", myEntity2.getValue()); System.out.println(isContain); int size = JSONPath.size(myEntity2, "$"); System.out.println(size); } } class MyEntity{ private int id; private String name; private Object value; public MyEntity(){ } public MyEntity(int id,String name){ this.id = id; this.name = name; } public MyEntity(int id,String name,Object value){ this(id,name); this.value = value; } @Override public String toString() { return "MyEntity [id=" + id + ", name=" + name + "]"; } //getter and setter }ParseProcess的用法:
package ms.fastjson; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.deserializer.ExtraProcessor; import com.alibaba.fastjson.parser.deserializer.ExtraTypeProvider; public class VO { private int id; private Map<String, Object> attributes = new HashMap<String, Object>(); public int getId() { return id; } public void setId(int id) { this.id = id;} public Map<String, Object> getAttributes() { return attributes;} public static void main(String[] args) { ExtraProcessor processor = new MyExtraProcessor(); VO vo = JSON.parseObject("{\"id\":123,\"value\":\"123456\"}", VO.class, processor); System.out.println(vo.getId()); //value被强行转成了Integer类型了 System.out.println(vo.getAttributes().get("value")); } } class MyExtraProcessor implements ExtraProcessor, ExtraTypeProvider { public void processExtra(Object object, String key, Object value) { VO vo = (VO) object; vo.getAttributes().put(key, value); } public Type getExtraType(Object object, String key) { if ("value".equals(key)) { return int.class; } return null; } };
提取JSON字符串里面的集合对象
当然我们也可以使用fastJson 来解析JSON字符串,比如我们有如下的JSON串。{ "code": "00", "t": [ { "chargeFree": 0, "date": "12-03 19:12", "showProdKeyName": "欧元/美元", "userImg": "http://116.31.94.164:8090/market-master-gateway/resources/images/upload", "verifyFlg": 0, "praiseCount": 0, "readCount": 0, "ifForward": 0, "points": 50, "ifSuccess": 0, "targetPrice": "1.0624"} ] }
我们想解析把 t 解析成一个对象,使用如下的方式:
JSONObject jsonObject = JSONObject.parseObject(str); String data = jsonObject.get("t").toString(); List<ViewPointEntity> lists = JSON.parseArray(data,ViewPointEntity.class);
当然省略一下中间的步骤也是可以的,可以用下面更好的方式:
List<ViewPointEntity> lists = (List<ViewPointEntity>)(JSON.parseObject(str).get(t));
提取json,直接封装成对象
例如json对象是如下格式:{
"ID": 515697,
"chargeFree": 0,
"commentCount": 0,
"confidence": "30"
}
可以通过下面的代码进行字符串转成对象操作:
ViewPointEntity viewpoint = JSON.parseObject(msg,ViewPointEntity.class);
就可以把上面的 t 转换成一个List了,然后就可以操作啦
另外我们可以让Chrome浏览器加载一个JSON的识别插件 项目地址:https://github.com/gildas-lormeau/JSONView-for-Chrome , 下载好后解压,加载已解压的程序的时候定位到WebContent 就可以了。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统