精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-13
最后修改:2011-08-13
http://code.alibabatech.com/mvn/snapshots/com/alibaba/fastjson/1.1.3-SNAPSHOT/ 这个版本修复了volking反映了List类型序列化时的bug。http://code.alibabatech.com/jira/browse/FASTJSON-70 这个版本引入了一些很酷的特性: 1、支持循环引用 很多用户在初次使用fastjson时都遇到了循环引用的问题,这是反映最多的问题,我越来越认识到支持循环引用的必要性。经过测试,加入循环应用的支持对性能的影响很小,小于5%。我决定在1.1.3加入循环应用支持,而且是缺省打开这个特性。 public static class Department { private int id; private String name; private Department parent; private Department root; private Collection<Department> children = new ArrayList<Department>(); public Department(){ } public Department getRoot() { return root; } public void setRoot(Department root) { this.root = root; } public Department(int id, String name){ this.id = id; this.name = 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; } public Department getParent() { return parent; } public void setParent(Department parent) { this.parent = parent; } public Collection<Department> getChildren() { return children; } public void setChildren(Collection<Department> children) { this.children = children; } } Department tech = new Department(1, "技术部"); tech.setRoot(tech); { Department pt = new Department(2, "平台技术部"); pt.setParent(tech); pt.setRoot(tech); tech.getChildren().add(pt); { Department sysbase = new Department(3, "系统基础"); sysbase.setParent(pt); sysbase.setRoot(tech); pt.getChildren().add(sysbase); } } { Department cn = new Department(4, "中文站技术部"); cn.setParent(tech); cn.setRoot(tech); tech.getChildren().add(cn); } { //JSON.toJSONString(tech); } { String prettyText = JSON.toJSONString(tech; System.out.println(prettyText); String text = JSON.toJSONString(tech); Department dept = JSON.parseObject(text, Department.class); Assert.assertTrue(dept == dept.getRoot()); } 输出的内容: { "children":[ { "children":[{ "children":[], "id":3, "name":"系统基础", "parent":{"$ref":".."}, "root":{"$ref":"$"} }], "id":2, "name":"平台技术部", "parent":{"$ref":".."}, "root":{"$ref":".."} }, { "children":[], "id":4, "name":"中文站技术部", "parent":{"$ref":".."}, "root":{"$ref":".."} } ], "id":1, "name":"技术部", "root":{"$ref":"@"} } { "children":[ { "children":[{ "children":[], "id":3, "name":"系统基础", "parent":{"$ref":".."}, // 上一级引用 "root":{"$ref":"$"} // 跟对象引用 }], "id":2, "name":"平台技术部", "parent":{"$ref":".."}, // 上一级引用 "root":{"$ref":".."} // 上一级引用 }, { "children":[], "id":4, "name":"中文站技术部", "parent":{"$ref":".."}, // 上一级引用 "root":{"$ref":".."} // 上一级引用 } ], "id":1, "name":"技术部", "root":{"$ref":"@"} // 引用自身 } 2、支持非缺省构造函数和静态工厂方法 基于编码习惯或者安全的原因,一些JavaBean没有缺省构造函数。fastjson 1.13开始支持这个特性。 例如: public static class Entity { private final int id; private final String name; @JSONCreator public Entity(@JSONField(name = "id") int id, @JSONField(name = "name") String name){ this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } } public static class Entity { private final int id; private final String name; // 静态工厂方法 @JSONCreator public static Entity create(@JSONField(name = "id") int id, @JSONField(name = "name") String name) { return new Entity(id, name); } private Entity(int id, String name){ this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } } 3、原型 希望以接口的方式来操作json数据,这个特性是借鉴了jackson的功能。 import junit.framework.Assert; import junit.framework.TestCase; import com.alibaba.fastjson.JSON; public class MaterializedInterfaceTest extends TestCase { public static interface Bean { int getId(); void setId(int value); String getName(); void setName(String value); } public void test_parse() throws Exception { String text = "{\"id\":123, \"name\":\"chris\"}"; Bean bean = JSON.parseObject(text, Bean.class); // 按接口调用 Assert.assertEquals(123, bean.getId()); Assert.assertEquals("chris", bean.getName()); bean.setId(234); Assert.assertEquals(234, bean.getId()); } } 总结 1.1.3提供的三个新特性,进一步完善了fastjson的功能,这也是一个重要的版本。希望大家帮忙测试,一起打造最好的json processor! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-15
已经下载了,正在测试中……
|
|
返回顶楼 | |
发表时间:2011-08-17
不支持Set序列?
比如public void setXxx(Set<String> xxx) 能序列化但是不能反序列化,提示 com.alibaba.fastjson.JSONException: java.util.ArrayList cannot be cast to java.util.Set |
|
返回顶楼 | |
发表时间:2011-08-17
最后修改:2011-08-17
KimShen 写道 不支持Set序列?
比如public void setXxx(Set<String> xxx) 能序列化但是不能反序列化,提示 com.alibaba.fastjson.JSONException: java.util.ArrayList cannot be cast to java.util.Set 谢谢你反馈这个BUG :) JIRA : http://code.alibabatech.com/jira/browse/FASTJSON-73 补充的BVT: http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/com/alibaba/json/test/bvt/bug/Bug_KimShen.java 欢迎使用最新版本继续试用: http://code.alibabatech.com/mvn/snapshots/com/alibaba/fastjson/1.1.3-SNAPSHOT/ |
|
返回顶楼 | |
发表时间:2011-08-17
新增加功能,支持序列化时输出类型信息。
在rpc的场景,用户自定义的类型信息中,参数类型是Object,传递之后需要按照原来的类型构造对象。这需要序列化时提供类型信息。在1.1.3版本中,完整实现了SerializerFeature.WriteClassName特性。 例如: public void test_0() throws Exception { Entity entity = new Entity(3, "jobs"); String text = JSON.toJSONString(entity, SerializerFeature.WriteClassName); System.out.println(text); // 输出 {"@type":"com.alibaba.json.test.bvt.WriteClassNameTest$Entity","id":3,"name":"jobs"} Entity entity2 = (Entity) JSON.parseObject(text, Object.class); Assert.assertEquals(entity.getId(), entity2.getId()); Assert.assertEquals(entity.getName(), entity2.getName()); } public static class Entity { private int id; private String name; public Entity(){ } public Entity(int id, String name){ this.id = id; this.name = 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; } } |
|
返回顶楼 | |
发表时间:2011-08-18
最后修改:2011-08-18
新增功能,支持Key类型不是String的Map的序列化和反序列化:
Map<Integer, Object> map = new HashMap<Integer, Object>(); map.put(1, "a"); map.put(2, "b"); String text = JSON.toJSONString(map); System.out.println(text); // 这里输出 {1:"a",2:"b"} Map<Integer, Object> map2 = JSON.parseObject(text, new TypeReference<Map<Integer, Object>>() {}); Assert.assertEquals(map, map2); 已经有用户提这方面的需求,而且要取代Java序列化或者Hessain,这个功能是必备的,所以就增加了这个功能。 欢迎大家到这里下载最新版本进行测试: http://code.alibabatech.com/mvn/snapshots/com/alibaba/fastjson/1.1.3-SNAPSHOT/ |
|
返回顶楼 | |
发表时间:2011-08-21
最后修改:2011-08-21
我就一个普通通过hibernate获得的对象,比如
Member member = session.load((long)1); Remember remember = member.getRemember(); String jsonString = JSON.toJSONString(remember); 就抛出了异常! java.lang.AbstractMethodError: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.getClientInfo()Ljava/util/Properties; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValue(FieldSerializer.java:92) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:129) 但如果我这么写 Remember tempRemember= new Remember(); Remember remember = member.getRemember(); BeanUtils.copyProperties(tempRemember, remember ); 就能通过 是不是不能直接toJSONString hibernate的托管对象呢? |
|
返回顶楼 | |
发表时间:2011-08-22
最后修改:2011-08-22
使用Spring AOP出现递归调用
Caused by: java.lang.StackOverflowError at com.alibaba.fastjson.serializer.SerializeWriter.writeKeyWithDoubleQuote(SerializeWriter.java:713) at com.alibaba.fastjson.serializer.SerializeWriter.writeFieldName(SerializeWriter.java:1162) at com.alibaba.fastjson.serializer.SerializeWriter.writeFieldValue(SerializeWriter.java:797) at Serializer_20.write1(Unknown Source) at Serializer_20.write(Unknown Source) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:176) at Serializer_20.write1(Unknown Source) at Serializer_20.write(Unknown Source) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:176) at Serializer_20.write1(Unknown Source) at Serializer_20.write(Unknown Source) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:176) at Serializer_20.write1(Unknown Source) at Serializer_20.write(Unknown Source) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:176) at Serializer_20.write1(Unknown Source) at Serializer_20.write(Unknown Source) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:176) at Serializer_20.write1(Unknown Source) at Serializer_20.write(Unknown Source) 表达式节点为:execution(* com.xxx.xxx.crontab.dao.*.*(..)) 相关代码为: private static String serializerParams(Object[] params) { JSONSerializer serializer = new JSONSerializer(); serializer.write(params); String jsonString = serializer.toString(); return jsonString; } public static void debug(Object message, Object ... params) { log.debug(message + ":" + serializerParams(params)); } 为什么会造成这种情况? 我只用了2个地方2次都莫名其妙的错误,如此不堪考验? |
|
返回顶楼 | |
发表时间:2011-08-23
请问是什么版本?如果是1.1.2版本,估计是循环引用的问题。
能否直接联系我,我好快速排查问题。 |
|
返回顶楼 | |
发表时间:2011-08-23
fastjson-1.1.2.jar
换成jackjson就好了, 不用aop的话没有问题. |
|
返回顶楼 | |