Jackson使用方法
Java下常見的Json類庫有Gson、JSON-lib和Jackson等,Jackson相對來說比較高效,在項目中主要使用Jackson進行JSON和Java對象轉換,下面給出一些Jackson的JSON操作方法。
準備工作
首先去GitHub下載Jackson工具包,有3個jar包需要下載:
+ jackson-core-2.8.1.jar (核心jar)
+ jackson-annotations-2.8.0.jar (該包提供Json註解支持)
+ jackson-databind-2.8.1.jar (對象序列化支持)
Core modules
Core modules are the foundation on which extensions (modules) build upon. There are 3 such modules currently (as of Jackson 2.6):
Streaming (docs) (“jackson-core”) defines low-level streaming API, and includes JSON-specific implementations
Annotations (docs) (“jackson-annotations”) contains standard Jackson annotations
Databind (docs) (“jackson-databind”) implements data-binding (and object serialization) support on streaming package; it depends both on streaming and annotations packages
Sample
Bean
package com.silion.androidproject.jackson;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Date;
/**
* Jackson提供了一系列註解,方便對JSON序列化和反序列化進行控制,下面介紹一些常用的註解。
@JsonIgnore 此註解用於屬性上,作用是進行JSON操作時忽略該屬性。
@JsonFormat 此註解用於屬性上,作用是把Date類型直接轉化爲想要的格式,如@JsonFormat(pattern = "yyyy年MM月dd日")
@JsonProperty 此註解用於屬性上,作用是把該屬性的名稱序列化爲另外一個名稱,如把eMail屬性序列化爲mail,@JsonProperty("mail")
*/
public class User {
private String mName;
@JsonIgnore // 不JSON序列化年齡屬性
private int mAge;
@JsonFormat(pattern = "yyyy年MM月dd日") // 格式化日期屬性
private Date mBirthday;
@JsonProperty("mail") // 序列化email屬性爲mail
private String mEmail;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public int getAge() {
return mAge;
}
public void setAge(int age) {
mAge = age;
}
public Date getBirthday() {
return mBirthday;
}
public void setBirthday(Date birthday) {
mBirthday = birthday;
}
public String getEmail() {
return mEmail;
}
public void setEmail(String email) {
mEmail = email;
}
@Override
public String toString() {
return "User{" +
"mName='" + mName + '\'' +
", mAge=" + mAge +
", mBirthday=" + mBirthday +
", mEmail='" + mEmail + '\'' +
'}';
}
}
佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.silion.androidproject.jackson.JacksonActivity">
<Button
android:text="Java2Json"
android:textSize="22sp"
android:onClick="java2Json"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:text="Json2Java"
android:textSize="22sp"
android:onClick="json2Java"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
JacksonActivity
package com.silion.androidproject.jackson;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.silion.androidproject.R;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JacksonActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jackson);
}
public void java2Json(View view) {
SimpleDateFormat dateformat = new SimpleDateFormat("MM/dd/yyyy");
User user1 = new User();
user1.setName("silion");
user1.setEmail("[email protected]");
user1.setAge(2);
try {
user1.setBirthday(dateformat.parse("10/01/2014"));
} catch (ParseException e) {
e.printStackTrace();
}
User user2 = new User();
user2.setName("silion");
user2.setEmail("[email protected]");
user2.setAge(2);
try {
user2.setBirthday(dateformat.parse("01/01/2015"));
} catch (ParseException e) {
e.printStackTrace();
}
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
// User類轉JSON
String json = object2Json(user1);;
// User類轉JSON : {"birthday":"2014年09月30日","name":"silion","mail":"[email protected]"}
System.out.println("User類轉JSON : " + json);
// Map轉JSON
Map<String, User> map = new HashMap<>();
map.put("silion", user1);
String jsonmap = object2Json(map);
// Map轉JSON : {"silion":{"birthday":"2014年09月30日","name":"silion","mail":"[email protected]"}}
System.out.println("Map轉JSON : " + jsonmap);
// List轉JSON
String jsonlist = object2Json(users);
// List轉JSON : [{"birthday":"2014年09月30日","name":"silion","mail":"[email protected]"},{"birthday":"2014年12月31日","name":"silion","mail":"[email protected]"}]
System.out.println("List轉JSON : " + jsonlist);
}
/**
* 將一個object轉換爲json, 可以使一個java對象,也可以使集合
*
* @param object
* @return
*/
private String object2Json(Object object) {
/**
* ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中實現。
* ObjectMapper有多個JSON序列化的方法,可以把JSON字符串保存File、OutputStream等不同的介質中。
* writeValue(File arg0, Object arg1)把arg1轉成json序列,並保存到arg0文件中。
* writeValue(OutputStream arg0, Object arg1)把arg1轉成json序列,並保存到arg0輸出流中。
* writeValueAsBytes(Object arg0)把arg0轉成json序列,並把結果輸出成字節數組。
* writeValueAsString(Object arg0)把arg0轉成json序列,並把結果輸出成字符串。
*/
ObjectMapper mapper = new ObjectMapper();
String json = null;
try {
json = mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return json;
}
public void json2Java(View view) {
String json = "{\"age\":2,\"birthday\":1412092800000,\"mail\":\"[email protected]\",\"name\":\"silion\"}";
String jsonmap = "{\"silion\":{\"birthday\":\"2014年09月30日\",\"name\":\"silion\",\"mail\":\"[email protected]\"}}";
String jsonlist = "[{\"age\":2,\"birthday\":1412092800000,\"mail\":\"[email protected]\",\"name\":\"silion\"},{\"age\":2,\"birthday\":1420041600000,\"mail\":\"[email protected]\",\"name\":\"silion\"}]";
/**
* ObjectMapper支持從byte[]、File、InputStream、字符串等數據的JSON反序列化。
*/
// JSON轉Class
User user = json2Class(json, User.class);
// JSON轉Class : User{name='silion', age=0, birthday=Wed Oct 01 00:00:00 GMT+08:00 2014, email='[email protected]'}
System.out.println("JSON轉Class : " + user);
// JSON轉Map
Map<String, User> map = json2Map(jsonmap);
// JSON轉Map : {silion=User{name='silion', age=0, birthday=Tue Sep 30 08:00:00 GMT+08:00 2014, email='[email protected]'}}
System.out.println("JSON轉Map : " + map);
// JSON轉List
List<User> users = json2List(jsonlist);
// JSON轉List : [User{name='silion', age=0, birthday=Wed Oct 01 00:00:00 GMT+08:00 2014, email='[email protected]'}, User{name='silion', age=0, birthday=Thu Jan 01 00:00:00 GMT+08:00 2015, email='[email protected]'}]
System.out.println("JSON轉List : " + users);
// JSON轉List2
List<User> users2 = json2List2(jsonlist);
// JSON轉List2 : [User{name='silion', age=0, birthday=Wed Oct 01 00:00:00 GMT+08:00 2014, email='[email protected]'}, User{name='silion', age=0, birthday=Thu Jan 01 00:00:00 GMT+08:00 2015, email='[email protected]'}]
System.out.println("JSON轉List2 : " + users2);
}
private List<User> json2List2(String jsonlist) {
ObjectMapper mapper = new ObjectMapper();
List<User> users = null;
try {
users = mapper.readValue(jsonlist, new TypeReference<List<User>>(){
});
} catch (IOException e) {
e.printStackTrace();
}
return users;
}
private List<User> json2List(String json) {
ObjectMapper mapper = new ObjectMapper();
List<User> users = null;
try {
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, User.class);
users = mapper.readValue(json, javaType);
} catch (IOException e) {
e.printStackTrace();
}
return users;
}
private Map<String, User> json2Map(String json) {
ObjectMapper mapper = new ObjectMapper();
Map<String, User> map = null;
try {
map = mapper.readValue(json, new TypeReference<Map<String, User>>(){
});
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
private <T> T json2Class(String json, Class<T> c) {
ObjectMapper mapper = new ObjectMapper();
T t = null;
try {
t = mapper.readValue(json, c);
} catch (IOException e) {
e.printStackTrace();
}
return t;
}
}