`
zybing
  • 浏览: 458893 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中JSON解析器的一点见解

 
阅读更多

最终采用了Jackson JSON,使用起来相当方便。

 

 

 

===========================================================================

本文地址:http://blog.csdn.net/chaijunkun/article/details/7208828,转载请注明出处。本博客会不定期对以前的文章内容进行补充和说明,强烈建议直接看博文原出处。

 

 

 

最近在研究JSON,Java中有很多处理JSON的类库,lib-json、sf-json、fastjson还有Jackson Json。第一个就不说了,性能和功能都没有什么亮点。

 

 

 

sf-json最大的优点就是随机读取方便。代码很简单:

 

JSONObject json= JSONObject.fromObject(str);

 

然后读取字段内容:

 

json.getString或者getInt之类的。但是工作效率有待商榷,而且容易出错。

 

另外sf-json还有个优点就是自动使用unicode编码,当内容中出现中文或者符号的时候会自动将其转换为\uFFFF这样的unicode编码。这样即便是在web服务器端的response中没有设置编码,直接推送json也不会出现乱码问题。

 

 

 

fastjson,顾名思义就是快。网上已经有很多性能对比的数据了,我就不多说其性能了。

 

这里要说的就是它的功能性问题。可能是定位不一样,最初fastjson就是要快,因此在对象的序列化与反序列化上下了很大功夫。但是在功能上有所缺乏。

 

不知在哪个版本开始加上了key按字典排序的功能。但是貌似这个功能没有办法关闭。有些时候我是不希望字段顺序被打乱的,这个问题就无法解决。

 

我使用的fastjson版本为1.1.14。另外fastjson还有一些bug没有解决,而且是比较明显的bug。例如在@JsonField 注解中format参数,这个是用来指定Date类型数据如何序列化的。如果你使用英文或符号,OK,没有问题(例如yyyy-MM-dd),但是格式中 一旦出现中文就会出错(例如yyyy年MM月dd日)。而且经过实验,所有的注解都要放在属性的Getter(就是getXXX()方法)上,直接放在属 性上是无法工作的。在eclipse中,一般我们都是直接写属性,属性写完后用自动生成的方式生成Getter和Setter方法。如果今后该类的属性发 生变化了,个人更倾向于直接删除所有Getter和Setter,然后重新生成。那么假如把注解全放到Getter上面,我删的时候就要非常小心。

 

再有一个比较致命的就是文档。几乎找不到全面的文档来介绍或支持fastjson。整个项目都由一个名为“温少”的人来负责,存在很多不确定的因素。

 

 

 

经过个人的评估,我更倾向于使用Jackson Json。首先说文档,Jackson Json官方网站上对每一个版本都有详尽的文档(http://jackson.codehaus.org/)。 另外Jackson Json的序列化与反序列化速度也并不见得有多慢。更重要的是它的注解支持要好于fastjson。就拿刚才说到的key按字典排序的功能吧,可以在实体 类上直接加上@JsonPropertyOrder(alphabetic=false)注解就可以关闭排序功能。而对于其他功能的注解支持也很好。

 

例如Date的序列与反序列化注解支持

 

@JsonSerialize(using=DateSerializer.class)
@JsonDeserialize(using=DateDeserializer.class)
private Date birthday;

 

这样就能指定对birthday字段的序列化与反序列化方法。另外,这两个注解都直接放在了属性上,没有放在Getter上。

 

针对上面的两个注解,我的序列化器是这样写的

 

public class DateSerializer extends JsonSerializer<Date>

 

继承了JsonSerializer,泛型中指定了序列化类型为Date,然后重写如下方法

 

@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException

 

方法中传进来的date就是将要被序列化的数据,接下来你可以任意展示该数据,在退出该方法之前使用gen.writeString(formattedDate);来完成序列化就可以了。

 

类似地,我的反序列化器是这样写的:

 

public class DateDeserializer extends JsonDeserializer<Date>

 

继承了JsonDeserializer,泛型中指定了反序列化类型为Date,然后重写如下方法

 

@Override
public Date deserialize(JsonParser parser, DeserializationContext context)throws IOException, JsonProcessingException {

 

这里面方法的返回值就是反序列化后的最终内容。方法内部你可以使用parser.getText()来获取到当前要处理的内容。你可以随便折腾里面的数据,只需要最后返回你想要的Date就可以了。

 

 

 

 

 

另外在制作基于Jackson Json的Service时想使用泛型的思想来写一个接口,最终目的就是希望方法能随着参数类型不同,返回值的类型也随之不同。以前很少写泛型的方法,这 个问题虽然基础,但是难住了我,经过查看Jackson Json的源代码,我得到了启示,像下面这样写就OK了:

 

public <T> T strToObj(String jsonStr, Class<T> clazz)

 

这样写就可以了。假设我有一个Result类型的对象需要反序列化,当前已经有了一个json字符串jsonStr,那么我只需要指定第二个参数clazz就可以直接得到Result类型的对象了:

 

Result newResult= jsonProcessService.strToObj(jsonStr, Result.class);

 

这样就不用在方法前加入(Result)类型强制转换了。

 

 

 

 

 

 

上面只是我的一些拙见,还请同仁们多多指教。

分享到:
评论

相关推荐

    对Java中JSON解析器的一些见解

    本文将探讨在Java中常见的JSON解析器库,包括它们的特点和应用场景。 首先提到的是lib-json,虽然文章中表示“第一个就不说了”,但实际上lib-json并未在主流的JSON处理库中占有一席之地,这里就不展开讨论了。 接...

    知乎爬虫(知乎网站爬取工具,爬取知乎网页内容)

    在给定的压缩包文件中,可能包含实现了以上功能的Java代码,如URL管理器、下载器、解析器和存储器的类,以及配置文件和可能的测试数据。通过对这些文件的研究,开发者可以学习如何构建一个完整的网络爬虫项目,包括...

    spring mvc学习视频相关资料

    视图解析器如 InternalResourceViewResolver 或 ThymeleafViewResolver 负责将逻辑视图名转换为实际视图资源,如 JSP 页面或 Thymeleaf 模板。 12. **单元测试与集成测试** Spring MVC 提供了 `MockMvc` 类,可以...

    sorl学习笔记及相关教程

    3. 自定义插件:可以通过编写插件扩展SOLR功能,如自定义分词器、过滤器、查询解析器等。 七、SOLR开发文档 SOLR的官方开发文档详尽介绍了各个组件和API的使用方法,是开发者的重要参考资料。 通过对SOLR的学习和...

    android开发等级

    - 精通XML和JSON数据格式的解析。 3. **其他技能**: - 熟悉网络编程基础,如Socket编程。 - 对多线程编程有一定的了解。 **发展建议:** - 在掌握了Java基础之后,进一步学习Java并发编程(Concurrent Library...

    handycapper:学习和探索赛马数据的最简单方法

    可解析PDF图表,将数据保存到嵌入式数据库中,并提供友好的体验来查看和搜索数据将数据导出到Microsoft Excel 通过基于JSON的REST API公开数据Java SDK,用于以编程方式访问统计图数据和/或数据库SQL编辑器以对...

    Kotlin.for.Android.Developers.2016

    作者Antonio Leiva通过这本书分享了自己丰富的经验和见解,帮助读者轻松上手Kotlin,并将其应用于实际的Android应用程序开发中。 #### 二、本书适合谁? 本书主要面向已经具备一定Android开发基础的开发者,特别是...

    Android Essentials

    4. **JSON处理**:学习如何解析和生成JSON数据,这是现代Web服务中最常用的格式之一。 #### 六、结语与展望 《Android Essentials》这本书不仅提供了构建Android应用所需的技术知识,更重要的是激发读者的创造力,...

    dependencies2017.zip

    3. **Python pip的改进**:Python的pip包管理器在这一年进行了多次升级,提高了依赖解析和安装的效率,减少了版本冲突。 4. **安全漏洞管理**:2017年,像Equifax这样的大型数据泄露事件突显了依赖管理中的安全风险...

    javacodebit:博客代码仓库

    11. **Java标准库**:例如日期时间API、并发工具类、XML处理、JSON解析等。 这个仓库对初学者和有经验的开发者都是宝贵的资源,因为它不仅提供了可运行的代码实例,还可能包含了博主对于特定问题的见解和解决方案,...

    Android开发视频(老罗第一季)

    - **JSON解析**:大多数Web服务都会返回JSON格式的数据,需要进行解析处理。 - **异步处理**:避免UI阻塞,提高用户体验,常用的技术有AsyncTask、Handler等。 #### 7. 多媒体开发 - **音频和视频播放**:利用...

    Springboot博客系统

    1. **博客管理**:支持创建、编辑、删除和查询博客,包括标题、内容、分类、标签等信息,允许用户发表个人见解和知识分享。 2. **用户管理**:提供用户注册、登录、个人信息管理等功能,确保用户账户安全,同时支持...

    RealEstateDataMining

    在房地产行业中,数据挖掘是一项至关重要的任务,它可以帮助我们揭示隐藏的模式、趋势以及关联,为决策者提供宝贵的见解。"RealEstateDataMining"项目显然聚焦于利用Java技术从互联网上提取和分析房地产相关数据。...

    android javaeye客户端

    接收到的JSON或XML格式的网络数据,需要解析成Java对象以便进一步处理。Android提供了Gson、Jackson等库进行数据解析,同时也可通过使用如Volley、Realm等库实现数据缓存,提高数据加载速度,减少网络请求。 五、UI...

    MyTopQuotes:来自离线电视节目的报价

    《MyTopQuotes:离线电视节目中的精彩语录解析》 在信息技术日益发达的今天,我们可以通过各种方式获取丰富的信息和知识,其中电视节目作为传统媒体的重要组成部分,一直以来都是人们获取知识、娱乐的重要渠道。...

Global site tag (gtag.js) - Google Analytics