从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处理过程中的确是个很小的环节,但其对国际化的影响却是深远和致命的,未来文章中相信他依然会频繁的露脸,届时我们再一起来看他是如何“略施小计”进而毁掉整个系统。
- 从json到gson
- gson转换json到bean时重命名
- GSON解析JSON保存到数据库
- Json----gson
- Json & Gson
- json & gson
- gson json
- GSON@JSON
- 从Json生成Gson可用的Java文件
- Gson轻松解析json数据并保存到Sqlite数据库
- Gson解析Json数据,并设置到编辑框
- Gson解析json绑定到listview 出学安卓,求大神指导
- 使用Gson解析json到任意类型的Bean
- JAVA从入门到精通(17)-- GSON
- xutils +Gson解析json(从服务器中获取json并解析)
- Gson解析Json数据
- Gson google json使用
- Json和Gson
- Entity Framework Core 数据库自动迁移API
- ubuntu搭建shadowsocks
- 重拾Hibernate框架——入门
- 利用Shell脚本来监控Linux系统的负载、CPU、内存、硬盘、用户登录数
- C++作业6
- 从json到gson
- Linux命令基础37-grep命令
- Java 编程思想--注解(二)
- 求职简历中一些常见的问题
- caffe-关于损失的问题
- 曾国藩的一生
- POJ 1251 Jungle Roads 笔记
- 单链表的删除算法时间复杂度O(1)和O(n)
- LINUX中常用操作命令