Fast是一个JSON的Processor,功能强大、易用、快速的!
* 功能强大。完全兼容json.org的规范,支持Java Bean、Map、Collections、Date、Enum。
* 易用。提供简单易用的toJSONString和parseObject接口,直接支持Java Bean,不需要额外配置映射。
* 快速。比目前已知的其他Java JSON Processor都要快,包括JSON-LIB、Simple JSON、GSON、Jackson。
* 开源。目前Fastjson是一个开源项目,采用Apache License 2.0协议,是阿里巴巴开源平台中的一个项目,公开的svn地址是:http://code.alibabatech.com/svn/fastjson/。公网上的 wiki地址是:http://code.alibabatech.com/wiki/display/fastjson/fastjson
当前文档
* http://code.alibabatech.com/wiki/display/fastjson/fastjson
* 下载该版本 http://code.alibabatech.com/svn/fastjson/repository/com.alibaba.fastjson/1.0.1/fastjson-1.0.1.jar
Release Notes
Bug
* [FASTJSON-2] - null转成对象时抛异常
* [FASTJSON-3] - 反序列化时不支持List<Map<String, String>>类型
New Feature
* [FASTJSON-1] - 增加JavaBean到JSONObject之间的转换
* [FASTJSON-7] - parse对数组的支持
17 楼
wenshao
2011-02-23
ccvcd 写道
wenshao 写道
ccvcd 写道
关注fastjson有段时间了,很想使用,以前用json-lib,一直没有下定决心使用fastjson很重要的一点是,json-lib在生成json字符串的时候可以实现过滤对象属性,可fastjson里一直没有看到这方面的解决办法,是不是考虑实现这一特性呢??
这个功能是支持的!比如:
public static class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } User user = new User(); user.setId(123); user.setName("毛头"); JSONSerializerMap mapping = new JSONSerializerMap(); mapping.put(User.class, new JavaBeanSerializer(User.class, Collections.singletonMap("id", "uid"))); JSONSerializer serializer = new JSONSerializer(mapping); serializer.write(user); String jsonString = serializer.toString(); Assert.assertEquals("{\"uid\":123}", jsonString);
在上面的例子中,User类有两个字段,过滤了name字段,而且把id字段重命名为uid。
public class JsonResult { private String message; private List results; public List getResults() { return results; } public void setResults(List obj) { this.results = obj; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
JsonResult 中的results是一个List,list中的对象有可能是 User对象,也可能是Group对象,如果我把
JsonResult对象生成json字符串,我该如果过滤呢,每次生成json字符串对象时,我只是知道一个可返回的属性列表,
User时是uid,name;Group时是id,groupName等等,
现在用json-lib 很容易实现,使用 JsonConfig setJsonPropertyFilter 方法,
使用 mapping.put(User.class, new JavaBeanSerializer(User.class, Collections.singletonMap("id", "uid")));
很难做Json的集中处理,总不能根据一个对象来写一段序列化配置吧。
明白你的意思了,考虑在1.0.2中实现,谢谢你指出这个问题。
18 楼
tywo45
2011-02-23
int[] intArr = new int[] { 4, 2 }; String jsonstr = JsonWrap.beanToJsonString_2(intArr); System.out.println(jsonstr);
报:Exception in thread "main" com.alibaba.fastjson.JSONException: TODO ERROR
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:129)
at com.alibaba.fastjson.parser.DefaultExtJSONParser.parseObject(DefaultExtJSONParser.java:160)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:120)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:130)
at com.talent.platform.core.json.JsonWrap.jsonStringToBean_2(JsonWrap.java:188)
at com.talent.platform.core.json.JsonWrap.main(JsonWrap.java:64)
19 楼
tywo45
2011-02-23
字段过滤的API,我觉得可以优化一下
20 楼
tywo45
2011-02-23
<dependencies> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.7.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-lgpl</artifactId> <version>1.7.1</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.4</version> <scope>test</scope> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1</version> <scope>test</scope> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> <scope>test</scope> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>1.6</version> <scope>test</scope> </dependency> </dependencies>
我好汗!
21 楼
wenshao
2011-02-23
tywo45 写道
int[] intArr = new int[] { 4, 2 }; String jsonstr = JsonWrap.beanToJsonString_2(intArr); System.out.println(jsonstr);
报:Exception in thread "main" com.alibaba.fastjson.JSONException: TODO ERROR
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:129)
at com.alibaba.fastjson.parser.DefaultExtJSONParser.parseObject(DefaultExtJSONParser.java:160)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:120)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:130)
at com.talent.platform.core.json.JsonWrap.jsonStringToBean_2(JsonWrap.java:188)
at com.talent.platform.core.json.JsonWrap.main(JsonWrap.java:64)
我刚测试过,没问题啊!
int[] array = new int[] {1, 2}; String text = JSON.toJSONString(array); JSON.parseObject(text, int[].class); System.out.println(text);
我用1.0.1版本测试的。
22 楼
wenshao
2011-02-23
tywo45 写道
字段过滤的API,我觉得可以优化一下
是的,要优化处理。如果有好的想法,请告诉我!
23 楼
wenshao
2011-02-23
tywo45 写道
<dependencies> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.7.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-lgpl</artifactId> <version>1.7.1</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.4</version> <scope>test</scope> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1</version> <scope>test</scope> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> <scope>test</scope> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>1.6</version> <scope>test</scope> </dependency> </dependencies>
我好汗!
这有什么问题么,要对比测试啊!
24 楼
Rooock
2011-02-24
wenshao 写道
Rooock 写道
JSONSerializer serializer = new JSONSerializer(new JSONSerializerMap().put(User.class, new JavaBeanSerializer(User.class, Collections.singletonMap("id", "uid"))));
这里, 写几个, 就显示几个. 不写, 就全过滤了?
是的,你猜对了!
温少. 假如User.class的字段为filed1, filed2, ..., filed100, id, name
需要将id重命名为uid, 同时过滤掉name. 但保留filed1~filed100不变
这个时候, 是不是很别扭..
25 楼
wenshao
2011-02-24
Rooock 写道
wenshao 写道
Rooock 写道
JSONSerializer serializer = new JSONSerializer(new JSONSerializerMap().put(User.class, new JavaBeanSerializer(User.class, Collections.singletonMap("id", "uid"))));
这里, 写几个, 就显示几个. 不写, 就全过滤了?
是的,你猜对了!
温少. 假如User.class的字段为filed1, filed2, ..., filed100, id, name
需要将id重命名为uid, 同时过滤掉name. 但保留filed1~filed100不变
这个时候, 是不是很别扭..
是啊,我也觉得不妥,所以要改进!
26 楼
lqixv
2011-02-24
Rooock 写道
wenshao 写道
Rooock 写道
JSONSerializer serializer = new JSONSerializer(new JSONSerializerMap().put(User.class, new JavaBeanSerializer(User.class, Collections.singletonMap("id", "uid"))));
这里, 写几个, 就显示几个. 不写, 就全过滤了?
是的,你猜对了!
温少. 假如User.class的字段为filed1, filed2, ..., filed100, id, name
需要将id重命名为uid, 同时过滤掉name. 但保留filed1~filed100不变
这个时候, 是不是很别扭..
我认为正常,因为这就象 sql 语句的写法。但不知有没有类似 * 号这样的通配符?如果没有的话,确实麻烦点。建议参考 sql 语句选择字段的做法。
27 楼
showtime520
2011-02-24
我觉得再加个exclude方法不就行了么?
28 楼
iminto
2011-02-24
http://code.alibabatech.com/wiki/display/fastjson/fastjson
这里还没更新?还是1.0.0
这里还没更新?还是1.0.0
29 楼
iminto
2011-02-24
文档还不够详细
30 楼
ccvcd
2011-02-24
wenshao 写道
whiletrue 写道
文档好少,不知道日期格式是怎么支持的?
对日期格式的支持包括long、ISO08601、还是new Date三种格式。
//字符串去空格处理 jsonConfig.registerJsonValueProcessor(java.lang.String.class, new StringJsonValueProcessor()); //日期值处理器 jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor());
对对象类型处理机制,是否也可以考虑json-lib的实现方式,
这样对日期的处理就会更加灵活了。
31 楼
wenshao
2011-02-24
iminto 写道
http://code.alibabatech.com/wiki/display/fastjson/fastjson
这里还没更新?还是1.0.0
这里还没更新?还是1.0.0
谢谢提醒,文档已经更新了!
32 楼
wenshao
2011-02-24
ccvcd 写道
wenshao 写道
whiletrue 写道
文档好少,不知道日期格式是怎么支持的?
对日期格式的支持包括long、ISO08601、还是new Date三种格式。
//字符串去空格处理 jsonConfig.registerJsonValueProcessor(java.lang.String.class, new StringJsonValueProcessor()); //日期值处理器 jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor());
对对象类型处理机制,是否也可以考虑json-lib的实现方式,
这样对日期的处理就会更加灵活了。
嗯,这是可以参考的一种实现,周末有空了就去做!
33 楼
tywo45
2011-02-24
谢谢温少的回复!
1、“我好汗”,是因为我以为fastjson依赖那个json组件,没想到原来是为了做对比测试。呵呵。
2、我那个错,是在svn下下来测试的,是个1.0.2的“快照”版(用mvn install,然后再用的),应该是取错版本了。
3、API的使用方式,我回头想想,不过给我第一感觉,是API暴露了实现细节。
1、“我好汗”,是因为我以为fastjson依赖那个json组件,没想到原来是为了做对比测试。呵呵。
2、我那个错,是在svn下下来测试的,是个1.0.2的“快照”版(用mvn install,然后再用的),应该是取错版本了。
3、API的使用方式,我回头想想,不过给我第一感觉,是API暴露了实现细节。
34 楼
whiletrue
2011-02-24
请问下温少,如果我想自己定义日期的格式怎么处理?比如格式化成 @1298533179070@,只是一串数字的,脚本得到了也不知道类型
35 楼
yaoba
2011-03-31
wenshao 写道
ccvcd 写道
wenshao 写道
whiletrue 写道
文档好少,不知道日期格式是怎么支持的?
对日期格式的支持包括long、ISO08601、还是new Date三种格式。
//字符串去空格处理 jsonConfig.registerJsonValueProcessor(java.lang.String.class, new StringJsonValueProcessor()); //日期值处理器 jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor());
对对象类型处理机制,是否也可以考虑json-lib的实现方式,
这样对日期的处理就会更加灵活了。
嗯,这是可以参考的一种实现,周末有空了就去做!
wenshao呀,等了好久了,都不有看到有这个功能呀,项目里已经用了fastjson 如果有这个功能那就方便很多呀
36 楼
tterry
2011-03-31
国内呢 还搞个英文页