论坛首页 Java企业应用论坛

请大家帮忙测试fastjson 1.1.3版本

浏览 8038 次
精华帖 (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!
   发表时间:2011-08-15  
已经下载了,正在测试中……
0 请登录后投票
   发表时间:2011-08-17  
不支持Set序列?
比如public void setXxx(Set<String> xxx)
能序列化但是不能反序列化,提示
com.alibaba.fastjson.JSONException: java.util.ArrayList cannot be cast to java.util.Set
0 请登录后投票
   发表时间: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/
0 请登录后投票
   发表时间: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;
    }
}
0 请登录后投票
   发表时间: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/
0 请登录后投票
   发表时间: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的托管对象呢?
0 请登录后投票
   发表时间: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次都莫名其妙的错误,如此不堪考验?
0 请登录后投票
   发表时间:2011-08-23  
请问是什么版本?如果是1.1.2版本,估计是循环引用的问题。

能否直接联系我,我好快速排查问题。
0 请登录后投票
   发表时间:2011-08-23  
fastjson-1.1.2.jar
换成jackjson就好了, 不用aop的话没有问题.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics