论坛首页 Java企业应用论坛

吹牛:我写的JSONParser可能是这个星球上最快了(Java)

浏览 143827 次
该帖已经被评为精华帖
作者 正文
   发表时间: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"
}
0 请登录后投票
   发表时间:2011-01-09   最后修改:2011-01-09
@厌倦发呆

明白你的意思了,我的输出格式搞错啦,已经改好了!

看来是我对ECMAScript5所支持的ISO8601理解不正确 


0 请登录后投票
   发表时间: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)
。。。。。。
0 请登录后投票
   发表时间: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,死循环了,不是对内存要求高。

能够把序列化的对象结构提供出来么?
0 请登录后投票
   发表时间: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 类里最后那两句有关呢?
0 请登录后投票
   发表时间:2011-01-09   最后修改:2011-01-09
应该是循环引用的问题,目前fastjson不会对循环引用作处理,所以一旦出现循环引用对象的序列化,就杯具了!
0 请登录后投票
   发表时间:2011-01-10   最后修改:2011-01-10
可以默认序列化的层级,比如默认3层,当前对象算一层,对象里面的对象属性或者容器算2层。当然要允许序列化全部。一般3层肯定够用了,超过3层可能本身就存在问题,为什么要序列化这么多数据到页面。死循环太危险了,这也是其他JSON工具的通病。
0 请登录后投票
   发表时间:2011-01-10   最后修改:2011-01-10
对于时间 我觉得还是 输出 时间戳 更好 无论怎么弄 更好的转换
0 请登录后投票
   发表时间:2011-01-10  
rtm 写道
可以默认序列化的层级,比如默认3层,当前对象算一层,对象里面的对象属性或者容器算2层。当然要允许序列化全部。一般3层肯定够用了,超过3层可能本身就存在问题,为什么要序列化这么多数据到页面。死循环太危险了,这也是其他JSON工具的通病。


3层是不够的,循环引用的检测成本较高,就算加入支持也不能够作为缺省实现。
0 请登录后投票
   发表时间: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,死循环了,不是对内存要求高。

能够把序列化的对象结构提供出来么?



程序的健壮性不是说不支持就好的, 要告诉客户发生了才是关键。







0 请登录后投票
论坛首页 Java企业应用版

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