该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-09
wenshao 写道 @厌倦发呆
是的,解析从宽,输出从严,原则和你所说的一样,解析的时候支持的特性如下: public static final int DEFAULT_PARSER_FEATURE; static { int features = 0; features |= Feature.AutoCloseSource.getMask(); features |= Feature.InternFieldNames.getMask(); features |= Feature.AllowUnQuotedFieldNames.getMask(); features |= Feature.AllowSingleQuotes.getMask(); DEFAULT_PARSER_FEATURE = features; } public static final int DEFAULT_GENERATE_FEATURE; static { int features = 0; features |= com.alibaba.fastjson.serializer.Feature.QuoteFieldNames.getMask(); features |= com.alibaba.fastjson.serializer.Feature.WriteMapNullValue.getMask(); DEFAULT_GENERATE_FEATURE = features; } 嗯,这里我是指ISO8601日期输出为字段值的时候,最好输出为字符串(加双引号)。即类似输出如下JSON: { "createDate": "2011-01-01T20:12:33" } |
|
返回顶楼 | |
发表时间:2011-01-09
最后修改:2011-01-09
@厌倦发呆
明白你的意思了,我的输出格式搞错啦,已经改好了! ![]() 看来是我对ECMAScript5所支持的ISO8601理解不正确 ![]() |
|
返回顶楼 | |
发表时间:2011-01-09
最后修改:2011-01-09
这个好像对内存要求太高了,我开发用的机器,全部内存才 2G,运行完浏览器、数据库、qq等后,只剩大约 1G 多点。使用了你的这个 fastjson 后,总是内存溢出,没法跑。
Caused by: java.lang.StackOverflowError at com.alibaba.fastjson.serializer.FieldSerializer.writePrefix(FieldSerializer.java:54) at com.alibaba.fastjson.serializer.StringFieldSerializer.write(StringFieldSerializer.java:29) at com.alibaba.fastjson.serializer.FieldSerializer.write(FieldSerializer.java:64) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:156) at com.alibaba.fastjson.serializer.ObjectFieldSerializer.write(ObjectFieldSerializer.java:47) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:156) at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:71) at com.alibaba.fastjson.serializer.ListFieldSerializer.write(ListFieldSerializer.java:31) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) 。。。。。。 |
|
返回顶楼 | |
发表时间:2011-01-09
最后修改:2011-01-09
lqixv 写道 这个好像对内存要求太高了,我开发用的机器,全部内存才 2G,使用了你的这个 fastjson 后,总是内存溢出,没法跑。
Caused by: java.lang.StackOverflowError at com.alibaba.fastjson.serializer.FieldSerializer.writePrefix(FieldSerializer.java:54) at com.alibaba.fastjson.serializer.StringFieldSerializer.write(StringFieldSerializer.java:29) at com.alibaba.fastjson.serializer.FieldSerializer.write(FieldSerializer.java:64) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:156) at com.alibaba.fastjson.serializer.ObjectFieldSerializer.write(ObjectFieldSerializer.java:47) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:156) at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:71) at com.alibaba.fastjson.serializer.ListFieldSerializer.write(ListFieldSerializer.java:31) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) 。。。。。。 这个是BUG,死循环了,不是对内存要求高。 能够把序列化的对象结构提供出来么? |
|
返回顶楼 | |
发表时间:2011-01-09
死循环?那会不会与我写的这个类有关?我的类的部分代码是:
public class Catalog extends IdEntity { private String name; private String description; private int orderNo; private Catalog parent; private List<Catalog> children = Lists.newArrayList(); 。。。。 我写的测试是: System.out.println(JSON.toJSONString(catalogs)); 这个类是不是与我的 catalog 类里最后那两句有关呢? |
|
返回顶楼 | |
发表时间:2011-01-09
最后修改:2011-01-09
应该是循环引用的问题,目前fastjson不会对循环引用作处理,所以一旦出现循环引用对象的序列化,就杯具了!
|
|
返回顶楼 | |
发表时间:2011-01-10
最后修改:2011-01-10
可以默认序列化的层级,比如默认3层,当前对象算一层,对象里面的对象属性或者容器算2层。当然要允许序列化全部。一般3层肯定够用了,超过3层可能本身就存在问题,为什么要序列化这么多数据到页面。死循环太危险了,这也是其他JSON工具的通病。
|
|
返回顶楼 | |
发表时间:2011-01-10
最后修改:2011-01-10
对于时间 我觉得还是 输出 时间戳 更好 无论怎么弄 更好的转换
|
|
返回顶楼 | |
发表时间:2011-01-10
rtm 写道 可以默认序列化的层级,比如默认3层,当前对象算一层,对象里面的对象属性或者容器算2层。当然要允许序列化全部。一般3层肯定够用了,超过3层可能本身就存在问题,为什么要序列化这么多数据到页面。死循环太危险了,这也是其他JSON工具的通病。
3层是不够的,循环引用的检测成本较高,就算加入支持也不能够作为缺省实现。 |
|
返回顶楼 | |
发表时间:2011-01-10
wenshao 写道 lqixv 写道 这个好像对内存要求太高了,我开发用的机器,全部内存才 2G,使用了你的这个 fastjson 后,总是内存溢出,没法跑。
Caused by: java.lang.StackOverflowError at com.alibaba.fastjson.serializer.FieldSerializer.writePrefix(FieldSerializer.java:54) at com.alibaba.fastjson.serializer.StringFieldSerializer.write(StringFieldSerializer.java:29) at com.alibaba.fastjson.serializer.FieldSerializer.write(FieldSerializer.java:64) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:156) at com.alibaba.fastjson.serializer.ObjectFieldSerializer.write(ObjectFieldSerializer.java:47) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:156) at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:71) at com.alibaba.fastjson.serializer.ListFieldSerializer.write(ListFieldSerializer.java:31) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:162) 。。。。。。 这个是BUG,死循环了,不是对内存要求高。 能够把序列化的对象结构提供出来么? 程序的健壮性不是说不支持就好的, 要告诉客户发生了才是关键。 |
|
返回顶楼 | |