从json到gson

眼下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对象并将其打印出来。

@Test
public 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的。我们这里假定前端仅做数据展示,没有任何处理)。          

@Test
public 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处理过程中的确是个很小的环节,但其对国际化的影响却是深远和致命的,未来文章中相信他依然会频繁的露脸,届时我们再一起来看他是如何“略施小计”进而毁掉整个系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值