`
jindw
  • 浏览: 508562 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

JSON解析新办法:JSEL

    博客分类:
  • Java
阅读更多
JSON解析和系列化功能,JSON官方网站是提供了官方的Java实现的(org.json)。

但是,官方的实现并不理想。
不仅接口复杂的要命。而且效率也不理想,基本可以判定是一个不合格产品。

另外一个我比较喜欢的解析器,叫做StringTree。
这个解析器最大的特点就是简单,JSONReader负责解析,JSONWriter负责序列化,成员方法也简单明了。
他的输出格式除原始类型外,返回的Map,和List,充分利用了Java 集合框架。比起官方实现来,干净了很多。

StringTree不仅简单易用,而且性能也非常不错。
根据我的测试结果,StringTree最好。大概是JSEL的两倍。
而官方版本最差,大概只有是JSEL一半。等比数列了,JSEL居中。

不过StringTree有一个bug,如果代码里面有注释,经常出现死循环。


再说JSEL
与专门的JSON解析相比,JSEL不仅可以解析标准的JSON数据,他还可以处理(忽略)JSON中插入的注释。甚至能处理一些简单的表达式计算,接口简单,性能也还不错。
如:
{
    "time":24*60*60*1000*365*(2008-1981),
    "data":[1,2,3,4,5],
     key:123
}


关于JSEL的更多的信息可参看如下连接:
详细介绍:http://code.google.com/p/lite/wiki/JSEL
详细介绍:http://code.google.com/p/lite/downloads/list
分享到:
评论
17 楼 star022 2009-06-05  
很早就想自己写个JSON解析工具的,
因为感觉标准的JSON对象格式无论key,value都要加上双引号,
这样会占用了不必要的数据传输量,
感觉{name:'张三', age:20}这样的格式似乎更好些!。
16 楼 srdrm 2008-12-09  
没有最好,只有更好. 不用贵的, 只用合适的
15 楼 jindw 2008-12-06  
低版本下的,自己用retrotranslator转一下吧。
14 楼 eddie 2008-12-05  
晕,这个库竟然使用jdk1.6编译的,一点没有兼容性的考虑!
13 楼 mujizi 2008-12-05  
jindw 写道
你是在json化java对象?确实如此,JSON化的时候还没有提供过滤属性的功能。
如果需要过滤属性,可自己尝试覆盖print函数试试。
或者,你自己先用Map和List构建一你想输出的数据集合。再做JSON化。

可以提供属性过滤的功能。
因为这个需求太常见了。
同时还需要指定是否序列化嵌套关系的类。
12 楼 jindw 2008-12-05  
你是在json化java对象?确实如此,JSON化的时候还没有提供过滤属性的功能。
如果需要过滤属性,可自己尝试覆盖print函数试试。
或者,你自己先用Map和List构建一你想输出的数据集合。再做JSON化。
11 楼 风之狐 2008-12-05  
嘿嘿,这玩意咋用啊,怎么解析一个类出来这么多数据,我这个类是一个实体bean,跟其他类有嵌套关系,我只想输出这个类几个属性,现在好像把嵌套类等等一堆东西都给解析了。
10 楼 walkman 2008-11-07  
我是进来拜楼主的:)
9 楼 jindw 2008-11-02  
hax 写道

最后,其实我觉得支持这些特性也不是不可以,不过如果你是要给别人当成json解析器来使用的话,至少应该就这些问题扔一些warning出来。或者更好的一个办法是增加一个参数来让用户指定错误处理的方式是完全忽略、输出警告或者抛出异常。


这点确实值得一做,以后有这个需求了再补上,简单的说就是,JSEL如果还能有严格语法的验证支持,就更好了。
8 楼 jindw 2008-11-02  
呵呵。
刀磨得太快怕切到手。
糖做的太甜说坏了你胃口。
Window做的太易用了,说人家宠坏了用户。


什么东西都有着利害两面,关键在于用户如何去用他。

JSEL支持更多的语法本没有错,要错就错在你被它宠坏,宠坏了也没有错,但是宠坏了你还要移情别恋,那就是你的问题了。
7 楼 hax 2008-11-02  
嗯,出现死循环确实是有问题,应该算bug。

还有么,宽松一点当然好。我们一直信奉要严于律己,宽以待人。不过在json之类的交换格式上,我觉得宽松不一定是一个好策略。

比方说写注释这个事情吧,jsel支持当然好,但是如果这个json也要为其他人所用,比如B端用,或者.NET的客户端用,那么他们的json解析就可能报错。使用者就可能会纳闷了,为什么你这儿好的,那就不好呢?如果这是一个比较大的软件,维护者要跟踪此类数据交换问题就比较头大,那可能就是好心办了坏事了。

我为什么这样说呢,是因为我有这样的教训。

有一次我手写了一些json数据放在服务器上,给ajax应用使用。本来好好的。后来换了一个js库,就老是不行。那个抓狂啊。后来发现是我原来手写的json数据有问题。

按照严格的json规范:

1. 字符串应该用双引号,而不是单引号。
2. key:value的key部分也必须用双引号。

也就是说正确的格式是:

{"a":"xyz"}

而我写js的习惯是:

{a:'xyz'}

用的原本的js库,它只是简单eval,所以没问题,而后来改用了一个js库,有非法字符过滤,结果就老是失败了。恰恰由于以前都很顺利,所以你很难想到是这里出了问题,最初的痛快导致了后来加倍的痛苦。

这个给出一个教训,在某些时候宽以待人未必就是好事,就好象你宠着孩子未必是好事一样。

另一个著名的反例就是html啦。html规范对tag soup应该怎么处理语焉不详,后果很严重,开发者很触气。现在html5虽然争议不少,但大家一致赞成要重新制定详细的html解析规则。

所以孔子说不可以德报怨,而要以直报怨。

最后,其实我觉得支持这些特性也不是不可以,不过如果你是要给别人当成json解析器来使用的话,至少应该就这些问题扔一些warning出来。或者更好的一个办法是增加一个参数来让用户指定错误处理的方式是完全忽略、输出警告或者抛出异常。
6 楼 jindw 2008-11-02  
hax 写道
不好意思,我来唱点反调。。。

东西蛮好,就是有点鸡肋(我是指当json解析器来用)。

如果我看JSON的规范没有理解错误的话,json是没有注释(也就是指// /*一类东西),也不支持表达式运算的。

所以StringTree不支持注释并不能算bug(反而能算是feature?)。

固然,可以认为jsel是更宽松,或者提供了扩展,但是就一般的BS中的json应用来说,这是没有意义的——B端的toJSONString之类的方法产生的应该总是严格的JSON,而不会给JSEL用武之地。

反过来说,没有一个JSON引擎可以让JSEL有用武之地,因为如果产生的不是严格的JSON,就失去了互操作性,也就失去了JSON的意义。再就json在B端的一般JS实现来说,eval虽然可以处理注释、表达式,但是比较严格的解析器出于数据安全考虑,可能会认为带有注释和表达式运算的代码是非法的json代码,特别是在未来浏览器允许跨域数据访问的情况下。未来的ES3.1加入的json专用方法我估计肯定不会接纳非标准的json,除非先重新厘定JSON标准。

当然,也许有其他特殊的use cases是JSEL的适用场合,只是我暂时还没有想到。



呵呵,欢迎反调。

我来一一解释吧:
StringTree不支持注释本没有错,但是有错误不报出来,还吧自己搞进一个死循环在那里吓折腾那就是大错了。
如果你的服务器上有这样一个“不能算bug的featrue”,那么,一旦被别人发现,那么你就只有等死的分了。

而对于JSEL支持简单表达式运算,支持注释,我倒是认为可以看做一个附加的 featrue。
就好像是我们生活在中国,学几门外语也不是错误。只要别把母语忘记就行。

如果是系列化的时候产生了标准之外的东西,那毫无疑问,这是一个特大bug。而我是解析,解析的时候宽松一点,特征多一点,只要不影响正确格式的解析,我认为也是可以的,兼容标准,但不限于标准。当能鸡肋说也有道理。

再说了,这个鸡肋也不是完全一无用处,比如说,如果是一个用户可修改的json数据源,那么,我个人就很希望我能写一些注释。


在顺便解释一下,写JSEL最初的目的不是为了JSON解析,只是写完了才发现,本身就是一个不错的JSON解析器。
算是无心插柳吧。
5 楼 hax 2008-11-02  
不好意思,我来唱点反调。。。

东西蛮好,就是有点鸡肋(我是指当json解析器来用)。

如果我看JSON的规范没有理解错误的话,json是没有注释(也就是指// /*一类东西),也不支持表达式运算的。

所以StringTree不支持注释并不能算bug(反而能算是feature?)。

固然,可以认为jsel是更宽松,或者提供了扩展,但是就一般的BS中的json应用来说,这是没有意义的——B端的toJSONString之类的方法产生的应该总是严格的JSON,而不会给JSEL用武之地。

反过来说,没有一个JSON引擎可以让JSEL有用武之地,因为如果产生的不是严格的JSON,就失去了互操作性,也就失去了JSON的意义。再就json在B端的一般JS实现来说,eval虽然可以处理注释、表达式,但是比较严格的解析器出于数据安全考虑,可能会认为带有注释和表达式运算的代码是非法的json代码,特别是在未来浏览器允许跨域数据访问的情况下。未来的ES3.1加入的json专用方法我估计肯定不会接纳非标准的json,除非先重新厘定JSON标准。

当然,也许有其他特殊的use cases是JSEL的适用场合,只是我暂时还没有想到。
4 楼 jindw 2008-11-02  
yxylwt 写道
json为什么需要解释啊?不是eval一下就行了吗?如果是在服务端组成返回的json字符串,感觉还是自己组合字符串更加舒服。


这个在于你怎么看json了。
json不是js专有的,现在已经可以看成一种与xml同类的数据交换格式。
3 楼 yxylwt 2008-11-02  
json为什么需要解释啊?不是eval一下就行了吗?如果是在服务端组成返回的json字符串,感觉还是自己组合字符串更加舒服。
2 楼 jindw 2008-11-02  
呵呵,确实,一种简单的数据模型,搞的接口那么复杂,完全丧失了JSON简单的优点。

刚写JSEL的时候,也没想过把它用作JSON解析引擎,但是写完了才发现,他就是一个有效的JSON解析引擎。

正好可以吧那个官方版本给替了。
1 楼 javatar 2008-11-02  
非常不错!我也一直觉得json.org的实现比较有问题。

相关推荐

    MFC,C++,C语言 json转换成std::map源码,无需编译,无需关心引用位置,直接引用即可使用

    如果遇到任何问题,例如JSON字符串格式不正确,或者解析过程中出现异常,该文件可能会提供解决办法。 总的来说,"MyJson"库为MFC开发提供了便捷的JSON到`std::map`转换功能,避免了对其他大型JSON库的依赖,简化了...

    json3.js 【JS / JavaScript 中解析JSON的js包,JSON官方的JSON解析包】

    json3.js 【JS / JavaScript 中解析JSON的js包,JSON官方的JSON解析包】。JavaScript中解析JSON的js包,页面中引入json3.js,即可使用。 使用方法:JSON.parse(str), JSON.stringify(obj) 更多详情请参考博文: ...

    kettle解析json串

    根据提供的信息,我们可以深入探讨如何在Kettle中解析JSON串,并连接数据库进行数据处理。本文将详细介绍使用Java库解析JSON的基本方法以及如何在Kettle环境中实现这一过程。 ### Kettle与JSON解析概述 #### 1. **...

    C++解析json字符串

    在IT行业中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。C++作为一款强大的系统编程语言,虽然原生并不支持JSON解析,但有多种库可以...

    MFC使用json11解析JSON

    在实际项目中,你可能还需要处理JSON解析的错误情况,比如使用`Json::parse`时可能出现的解析错误。json11会抛出`json11::Json::parse_error`异常,因此确保你的代码能够捕获并适当地处理这些异常。 总的来说,通过...

    C#对多级json解析

    在C#编程环境中,处理JSON数据是常见的任务,尤其是在需要解析多级嵌套结构时。本篇文章将深入探讨如何在C#中对多级JSON进行解析,并通过实际代码示例来阐述其原理。 首先,我们需要了解C#中用于解析JSON的库,最...

    json.zip_JSON_c/c++ json_c/c++ json 解析_json解析 c++_解析json

    在C++中,处理JSON数据通常涉及到解析、序列化和操作JSON对象。以下是一些关于C++中JSON解析的重要知识点: 1. **JSON格式**:JSON格式基于JavaScript语法,但它是独立于语言的。基本结构包括对象(键值对的集合,...

    iOS下json解析工具

    iOS下解析json数据,自己亲自使用过,挺好用的。 使用JSONKit的解析方法:(需导入包:#import "JSONKit/JSONKit.h") - (void)printJson{ //如果json是“单层”的,即value都是字符串、数字,可以使用...

    PB解析json,解析JSON案例,解析jsondemo

    标题中的“PB解析json,解析JSON案例,解析jsondemo”表明了本文主要关注的是PowerBuilder(简称PB)如何处理JSON数据。在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,...

    Android 安卓 json解析

    我们将涵盖两种解析方式:本地JSON解析和在线JSON解析。 ### 1. JSON基础知识 JSON是一种文本格式,基于JavaScript语法,但独立于语言。它以键值对的形式存储数据,如`"key": "value"`。数组可以通过方括号`[]`表示...

    PB Json解析库

    3. 转换为JSON:调用PB Json解析库提供的函数,将PB二进制数据转换为JSON字符串。 4. JSON到PB:在接收端,接收到JSON字符串后,通过解析库反向操作,将JSON转换回PB对象。 5. 反序列化:最后,反序列化PB对象,恢复...

    json2-min.js(亲测可用)

    `json2-min.js` 文件是一个针对JSON的JavaScript库,主要功能是为那些不支持原生JSON的旧版浏览器提供JSON的解析和序列化功能。 在JavaScript中,JSON主要用于数据传输,特别是在与服务器进行AJAX通信时。原生的...

    Json解析辅助.zip

    本篇将围绕“Json解析辅助”这一主题,详细讲解JSON的基本概念、结构、解析方法以及相关辅助工具的应用。 1. JSON的基本结构: JSON基于JavaScript的一个子集,主要由对象和数组两种基本结构构成。对象是键值对的...

    最全的 json解析JAR包

    - org.json:一个轻量级的库,包含JSONObject,JSONArray等类,适用于简单的JSON操作。 5. JSON解析JAR包: "最全的json解析JAR包"可能包含了上述提到的多个库的JAR文件,这使得开发者可以在不安装额外框架的情况...

    C#中Json 解析类库,使用dictionary 解析未知字段的对象

    3. 解析JSON字符串:使用`JsonConvert.DeserializeObject`方法将JSON字符串解析为Dictionary对象。 ```csharp string jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; jsonDictionary = ...

    C++ Json解析

    - 解析JSON:调用解析函数,传入JSON字符串,生成解析后的数据结构。 - 遍历和访问数据:通过解析后的数据结构,访问并处理JSON中的键值对或数组元素。 4. 示例代码 使用nlohmann/json库的示例: ```cpp #...

    鬼脸JSON解析小工具forMac

    8. **更新和支持**:开发者通常会定期更新软件,修复已知问题,增加新功能,以保持与最新JSON标准的同步,并提供技术支持,解答用户疑问。 9. **安全性**:在处理敏感数据时,该工具应具备良好的安全措施,确保用户...

    JSON解析demo.zip

    本示例"JSON解析demo.zip"提供的可能是一个使用自定义封装类快速解析JSON数据的实例,这对于简化代码和提高效率非常有用。 首先,我们来了解`org.json`库中的主要类: 1. **JSONObject**:代表一个JSON对象,它由...

    最简单最高效的Json解析

    在本文中,我们将深入探讨JSON的基本概念、解析方式以及如何实现最简单最高效的方法。 JSON的结构基于两种基本类型:对象和数组。对象是键值对的集合,用花括号{}包围,键由双引号包围,值可以是各种JSON类型,包括...

    json离线解析工具

    标题中的“json离线解析工具”指的是无需互联网连接即可使用的JSON解析软件,这对于那些网络环境不稳定或者需要保护数据隐私的用户来说非常实用。描述中提到的这款“Windows版绿色离线json解析工具”,强调了它的...

Global site tag (gtag.js) - Google Analytics