JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,不仅便于机器解析,而且易于让人阅读。
谈起数据持久化储存,Java和MFC有序列化,Windows下还经常使用INI和注册表,甚至可以自己scanf printf一套新的标准。但是在网络上传递数据,尤其是需要时不时地检查调试数据的时候,则需要一种人眼可阅读的语言,这时就轮到JSON上场了。
serialize化的数据直接用文本工具打开看到的都是乱码,不同于serialize,JSON数据直接可以打开阅读,并且几乎不需要学习新的语法,非常便于阅读。比如:
{ "name" : { "first" : "Joe", "last" : "Sixpack" }, "gender" : "MALE", "verified" : false, "userImage" : "Rm9vYmFyIQ==" }
一眼可以看出这段 JSON data 描述了一个用户的基本信息,其中name字段对应的是另一个对象(凡是大括号包起来的就是一个对象)。
那么在Java里如何解析和生成JSON数据呢?
Jackson 框架可以很轻松地完成这一任务:http://jackson.codehaus.org/
下面来看看如何将上述JSON数据转化为Java的对象。
首先去下载Jackson的库:
下载地址:http://wiki.fasterxml.com/JacksonDownload
Jackson 框架2.x似乎分成了三个jar包:
Core (release notes)
Annotations (release notes)
Databind (release notes)
第一个是核心jar,其余的是拓展。
而Jackson 框架1.x则集成为一整个jar包,非常便携,没有其他要求的话就用这个好了,1.x最新的版本下载地址:
http://jackson.codehaus.org/1.9.11/jackson-all-1.9.11.jar
然后建立测试项目,导入jar
项目结构:
其中User类是与上述JSON数据配套的Java类:
package com.hankcs; import java.util.Arrays; /** * @author Hankcs */ public class User { public enum Gender { MALE, FEMALE }; public static class Name { private String _first, _last; public String getFirst() { return _first; } public String getLast() { return _last; } public void setFirst(String s) { _first = s; } public void setLast(String s) { _last = s; } @Override public String toString() { return "Name{" + "_first='" + _first + '\'' + ", _last='" + _last + '\'' + '}'; } } private Gender _gender; private Name _name; private boolean _isVerified; private byte[] _userImage; public Name getName() { return _name; } public boolean isVerified() { return _isVerified; } public Gender getGender() { return _gender; } public byte[] getUserImage() { return _userImage; } public void setName(Name n) { _name = n; } public void setVerified(boolean b) { _isVerified = b; } public void setGender(Gender g) { _gender = g; } public void setUserImage(byte[] b) { _userImage = b; } @Override public String toString() { return "User{" + "_gender=" + _gender + ", _name=" + _name + ", _isVerified=" + _isVerified + ", _userImage=" + Arrays.toString(_userImage) + '}'; } }
/user.json就是等待解析JSON数据。
Main类:
package com.hankcs; import org.codehaus.jackson.map.ObjectMapper; import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) { // write your code here ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally try { // 尝试从JSON中读取对象 User user = mapper.readValue(new File("user.json"), User.class); System.out.println(user); user.setGender(User.Gender.FEMALE); mapper.writeValue(new File("user-modified.json"), user); } catch (IOException e) { e.printStackTrace(); } } }
只需要两句话就能解析出来:
ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue(new File("user.json"), User.class);
写入也很简单,一句话搞定:
mapper.writeValue(new File("user-modified.json"), user);
输出:
User{_gender=MALE, _name=Name{_first='Joe', _last='Sixpack'}, _isVerified=false, _userImage=[70, 111, 111, 98, 97, 114, 33]}
项目源码:http://pan.baidu.com/s/1dDiQ8Vn
参考资料:http://wiki.fasterxml.com/JacksonInFiveMinutes#Full_Data_Binding_.28POJO.29_Example
知识共享署名-非商业性使用-相同方式共享:码农场 » 五分钟Jackson入门(一) JSON数据与Java对象相互转换(附项目源码)
怎么没用git呢,挺好用的呢
下次试试,听说Windows下 tortoise git 挺好用:-)