从json到gson

来源:互联网 发布:网络k歌动圈麦克风推荐 编辑:程序博客网 时间:2024/06/13 22:39

眼下JSON(JavaScriptObject Notation)已经成为业内使用最为广泛的数据传输格式了,似乎不用JSON来存点儿东西,出门都不好意思跟人到招呼。这种与开发语言无关,轻量级的数据格式,之所以能够发展的如此迅猛,优点一定是显而易见的,例如:

·        易于人类阅读和编写,格式都是压缩的,占用带宽小

·        易于程序解析与生产,客户端JavaScript可以简单的通过eval_r()进行JSON数据的读取

·        语言无关性,ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等多种server语言均可解析

·        简化了服务器端和客户端的代码开发量,并且易于维护

然而平心而论,许久之前,我们一直使用的XML就当真没有这样的优势?果然无法胜任如此工作了么?一时语塞,还是古人总结的到位——“长江后浪推前浪,浮事新人换旧人”。

 

再看看JSON的缺点吧。

·        JSON片段的创建和验证过程比一般的XML稍显复杂

 

到此为止,似乎都是易用性和性能的提升,没看出来跟国际化有任何关系吧?确实,如果JSON不需要serialize和deserialize的话,那就真的可以跟国际化沙扬娜拉了。真的就这么点儿相关的东西么?然!不过还是得奉劝大家,真的别把豆包不当干粮。历史一直在不断的告诉我们,千里之堤往往仅是溃于蚁穴的。

 

言归正传,先看org.json的示例,在pom.xml中添加如下依赖。

<dependency>    <groupId>org.json</groupId>    <artifactId>json</artifactId>    <version>20090211</version></dependency>

随后尝试从bean中构造一个JSON对象并将其打印出来。

@Testpublic void testChineseJson() throwsParseException{                             Playerp = new Player();            p.setId(21);            p.setName("席尔瓦");            DateFormatdf = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);            Stringbirth = "1986年1月8日";            p.setBirthday(df.parse(birth));            p.setClub("曼城");            JSONObjectjo = new JSONObject(p);        System.out.println(jo.toString());}

结果如下,即便我们明示了DateFormat后,birthday依然存在问题。试图将其desiralize回去,蓦然发现JSONObject居然没有这个功能……

{"birthday":"WedJan 08 00:00:00 CST 1986","name":"席尔瓦","club":"曼城","id":21}

 好吧,果断放弃json转而添加gson的依赖。

<dependency>   <groupId>com.google.code.gson</groupId>    <artifactId>gson</artifactId>    <version>2.8.0</version></dependency>

调用Gson.toJson后,打印结果如下。

{"number":21,"name":"席尔瓦","birthday":"Jan 8, 1986 12:00:00AM","club":"曼城"}

birthday仍然并未达到国际化开发和测试的要求(当然,将该json传到前端,让js自己去处理也是完全ok的。我们这里假定前端仅做数据展示,没有任何处理)。          

@Testpublic void testChineseGsonWithBuilder ()throws ParseException    {                 Playerp = new Player();            p.setId(21);            p.setName("席尔瓦");            DateFormatdf = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);            Stringbirth = "1986年1月8日";            p.setBirthday(df.parse(birth));            p.setClub("曼城");            GsonBuilderbu = new GsonBuilder();            bu.setPrettyPrinting();            bu.registerTypeAdapter(Date.class,new DateTypeAdapter());            Gsongs = bu.create();            System.out.println(gs.toJson(p));}

其中DateTypeAdapter需要实现JsonSerializer<Date>和JsonDeserializer<Date>这两个接口,以实现serialize和deserialize方法。再次运行,这次结果就相当满意了。

{  "number": 21,  "name": "席尔瓦",  "birthday": "1986年01月08日",  "club": "曼城"}

JSON的序列化和反序列化在整个API处理过程中的确是个很小的环节,但其对国际化的影响却是深远和致命的,未来文章中相信他依然会频繁的露脸,届时我们再一起来看他是如何“略施小计”进而毁掉整个系统。

原创粉丝点击