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 挺好用:-)