項目實戰-Jackson使用

Jackson使用方法

Java下常見的Json類庫有Gson、JSON-lib和Jackson等,Jackson相對來說比較高效,在項目中主要使用Jackson進行JSON和Java對象轉換,下面給出一些Jackson的JSON操作方法。

介紹 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;
    }
}
發佈了41 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章