Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。
一、一个简单的例子
将文件中的json数据转换成java对象。修改后再转换成json对象写入文件
1-1、文件json数据如下:
{
"name" : { "first" : "Joe", "last" : "Sixpack" },
"gender" : "MALE",
"verified" : false,
"userImage" : "Rm9vYmFyIQ=="
}
1-2、java对象
public class User {
private Name name;
private Gender gender;
private boolean verified;
private byte[] userImage;
public enum Gender{
MALE,FEMALE
};
class Name {
private String first;
private String last;
public Name(){
}
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public boolean isVerified() {
return verified;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
public byte[] getUserImage() {
return userImage;
}
public void setUserImage(byte[] userImage) {
this.userImage = userImage;
}
@Override
public String toString() {
return "User{" +
"name=" + name +
", gender=" + gender +
", verified=" + verified +
", userImage=" + Arrays.toString(userImage) +
'}';
}
}
1-3、使用jackson进行json对象转换
public class JacksonSimpleDemo {
public static void main(String[] args) {
String userFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"user.json";
ObjectMapper mapper = new ObjectMapper();
try {
//将文件中的json数据转换成User对象
User user = mapper.readValue(new File(userFilePath),User.class);
System.out.println(user.toString());
//将User对象修改后转成json数据并写入数据
String changedFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"changed_user.json";
user.setGender(User.Gender.FEMALE);
mapper.writeValue(new File(changedFilePath),user);
} catch (IOException e) {
e.printStackTrace();
}
}
}
1-4、jsckson的maven坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.3</version>
</dependency>
代码下载地址:http://download.csdn.net/detail/jasonware/8676999
二、使用Map、ArrayList等对象进行转换
2-1、Jackson默认类型转换:
JSON Type | Java Type |
object | LinkedHashMap<String,Object> |
array | ArrayList<Object> |
string | String |
number (no fraction) | Integer, Long or BigInteger (smallest applicable) |
number (fraction) | Double (configurable to use BigDecimal) |
true|false | Boolean |
null | null |
<pre style="background-color:#ffffff;color:#000000;font-family:'Menlo';font-size:12.0pt;"><span style="color:#808080;font-style:italic;">//范型的使用方式
</span>String userFilePath_4_FMap = JacksonSimpleDemo.<span style="color:#000080;font-weight:bold;">class</span>.getResource(<span style="color:#008000;font-weight:bold;">"/"</span>).getPath()+<span style="color:#008000;font-weight:bold;">"user_4_FMap.json"</span>;
Map<String,User> userFMap = mapper.readValue(<span style="color:#000080;font-weight:bold;">new </span>File(userFilePath_4_FMap), <span style="color:#000080;font-weight:bold;">new </span>TypeReference<Map<String,User>>(){
});
System.<span style="color:#660e7a;font-weight:bold;font-style:italic;">out</span>.println(<span style="color:#008000;font-weight:bold;">"joe's lastName :"</span>+userFMap.get(<span style="color:#008000;font-weight:bold;">"joe"</span>).getName().getLast());
public class jacksonMapDemo { public static void main(String[] args) { String userFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"user.json"; ObjectMapper mapper = new ObjectMapper(); try { //读取json数据到Map对象 Map<String,Object> userMap = mapper.readValue(new File(userFilePath),Map.class); System.out.println(userMap); //写Map对象到json数据 Map<String,String> nameStruct = new HashMap<String,String>(); nameStruct.put("first", "Joe"); nameStruct.put("last", "may"); userMap.put("name", nameStruct); userMap.put("gender", "MALE"); userMap.put("verified", Boolean.FALSE); userMap.put("userImage", "Rm9vYmFyIQ=="); String changedFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"changed_user_4_map.json"; mapper.writeValue(new File(changedFilePath), userMap); } catch (IOException e) { e.printStackTrace(); } }}
我们可以看到控制台输出:
{name={first=Joe, last=Sixpack}, gender=MALE, verified=false, userImage=Rm9vYmFyIQ==}
以及生成的新文件内容
{"name":{"last":"may","first":"Joe"},"gender":"MALE","verified":false,"userImage":"Rm9vYmFyIQ=="}
2-2、上面例子我们使用了默认的Map<String,Object>类型,如果使用范型如Map<String,User>要怎么处理呢?java的擦除机制不允许使用Map<String,User>.class
jackson为范型提供了解决方案:
Map<String,User> result = mapper.readValue(src, <span style="color:#FF0000;">new TypeReference<Map<String,User>>() { }</span>);
如:
json对象为:
{
"joe":{
"name" : { "first" : "Joe", "last" : "Sixpack" },
"gender" : "MALE",
"verified" : false,
"userImage" : "Rm9vYmFyIQ=="
}
}
代码为:
//范型的使用方式
String userFilePath_4_FMap = JacksonSimpleDemo.class.getResource("/").getPath()+"user_4_FMap.json";
Map<String,User> userFMap = mapper.readValue(new File(userFilePath_4_FMap), <span style="color:#FF6666;">new TypeReference<Map<String,User>>(){
}</span>);
System.out.println("joe's lastName :"+userFMap.get("joe").getName().getLast());
输出为:
joe's lastName :Sixpack
三、使用XML形式解析json。(json数据看起来就是一棵树结构)
public class JacksonXmlDemo {
public static void main(String[] args) {
String userFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"user.json";
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode rootNode = mapper.readTree(new File(userFilePath));
JsonNode nameNode = rootNode.get("name");
String firstName = nameNode.get("first").asText();
System.out.println("firstName is : "+firstName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果为:
Joe