JSON與JAVA對象互轉(zhuǎn)

常用的方案

  • Jackson
  • Gson (Google)
  • Fastjson (阿里)

本文使用 Fastjson

Fastjson

-### 添加依賴

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.58</version>
</dependency>
  • 首先創(chuàng)建一個JAVA類:User.java

//User.java

package com.example.helloworld;

public class User{
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString(){
        return "ID=" + id + " , " + "NAME=" +name;
    }
}
  • API簡介

//將JAVA對象轉(zhuǎn)換成JSON格式字符串
 String str = JSON.toJSONString(json, false);
//-----------------------------------------------
//將JAVA對象轉(zhuǎn)換成JSON對象
JSONObject obj = (JSONObject) JSON.toJSON(User user);
//將JAVA對象轉(zhuǎn)換成JSON數(shù)組
JSONArray obj = (JSONArray) JSON.toJSON(List<User> list);
//-----------------------------------------------
//將JSON字符串,轉(zhuǎn)換成JAVA對象
User user = JSON.parseObject(json.toJSONString(), User.class);
//將JSON字符串猩谊,轉(zhuǎn)換成JAVA的LIST對象
List<User> list = JSON.parseObject(array.toJSONString(), new TypeReference<ArrayList<User>>() {});
  • 測試代碼如下

package com.example.helloworld;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class HelloworldApplicationTests {
    //-----------------------------------------------------------
    //JAVA對象轉(zhuǎn)JSON字符串
    @Test
    public void Java2JsonString1() {
        User user = createUser(6, "Jack");
        String str = JSON.toJSONString(user, false);
        System.out.println(str);
    }
    //輸出:{"id":6,"name":"Jack"}
    //-----------------------------------------------------------
    //JAVA對象(List)轉(zhuǎn)JSON字符串
    @Test
    public void Java2JsonString2() {
        List<User> list = createUserList();
        String str = JSON.toJSONString(list, false);
        System.out.println(str);
    }
    //輸出:[{"id":6,"name":"Jack"},{"id":8,"name":"張三豐"}]
    //-----------------------------------------------------------
    //JAVA對象轉(zhuǎn)JSON對象
    @Test
    public void Java2JsonObj() {
        User user = createUser(6, "Jack");
        JSONObject obj = (JSONObject) JSON.toJSON(user);
        System.out.println(obj);
    }
    //輸出:{"name":"Jack","id":6}
    //-----------------------------------------------------------
    //JAVA(LIST)對象轉(zhuǎn)JSON數(shù)組對象
    @Test
    public void Java2JsonArray() {
        List<User> list = createUserList();
        JSONArray obj = (JSONArray) JSON.toJSON(list);
        System.out.println(obj);
    }
    //輸出:[{"name":"Jack","id":6},{"name":"張三豐","id":8}]
    //-----------------------------------------------------------
    //JSON字符串轉(zhuǎn)JAVA對象
    @Test
    public void Json2Java1() {
        JSONObject json = createJsonObject(6, "Jack");
        User user = JSON.parseObject(json.toJSONString(), User.class);
        System.out.println(user);
    }
    //輸出:ID=6 , NAME=Jack
    //-----------------------------------------------------------
    //JSON字符串轉(zhuǎn)JAVA對象
    @Test
    public void Json2Java2() {
        JSONArray array = new JSONArray();
        array.add(createJsonObject(6, "Jack"));
        array.add(createJsonObject(8, "張三豐"));
        List<User> list = JSON.parseObject(array.toJSONString(), new TypeReference<ArrayList<User>>() {
        });
        System.out.println(list);
    }
    //輸出:[ID=6 , NAME=Jack, ID=8 , NAME=張三豐]
    //-----------------------------------------------------------
    private User createUser(int id, String name) {
        User user = new User();
        user.setId(id);
        user.setName(name);
        return user;
    }

    private List<User> createUserList() {
        List<User> list = new ArrayList<User>();
        list.add(createUser(6, "Jack"));
        list.add(createUser(8, "張三豐"));
        return list;
    }

    private JSONObject createJsonObject(int id, String name) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("ID", id);
        jsonObject.put("Name", name);
        return jsonObject;
    }
}
  • 控制轉(zhuǎn)換:@JSONField

缺省情況下, Fastjson根據(jù)get/set 方法來推斷使用的屬性名稱宪彩。
例如:

  • getId() --> {"id":2}
  • getTableName() --> {"tableName":"mytable"}
    這種轉(zhuǎn)換可能不是想要的垂寥,例如希望 {"TABLE _NAME":"mytable"},這時就需要進(jìn)行轉(zhuǎn)換控制脆霎。
    @JSONField(name = "NAME")     // get方法:控制序列化時使用的屬性名稱 ( JAVA>JSON)
    public String getName() {
        return super.getString("NAME");
    }

    @JSONField(name = "NAME")    // set方法:控制反序列化時使用的屬性名稱 (JSON>JAVA)
    public void setName(String name) {
        super.put("NAME", name);
    }

日期格式化

    @JSONField(name = "DATE", format = "yyyy-MM-dd HH:mm:ss.SSS")
    public Date getDate() {
        return super.getDate("DATE");
    }

    @JSONField(name = "DATE", format = "yyyy-MM-dd HH:mm:ss.SSS")
    public void setDate(Date date) {
        super.put("DATE", date);
    }

序列化控制

   @JSONField(serialize = false)           //該屬性不序列化
   public String getNameWithID() {
       return getName() + "-" + getID();
   }

   @JSONField(deserialize = false)    //該屬性不反序列化
   public void setNameWithID(String nameWithID) {
       String[] strs = nameWithID.split("-");
       this.setName(strs[0]);
       this.setName(strs[1]);
   }
  • 控制轉(zhuǎn)換(枚舉)

    public EType getUserType() {
        return (EType) super.get("userType");
    }

    public void setUserType(EType userType) {
        super.put("userType", userType);
    }
  • 控制轉(zhuǎn)換(泛型 - 反序列化)

//使用 TypeReference
JSON.parseObject(json,new TypeReference<ArrayList<User>>(){});
  • 參考資料

http://kimmking.github.io/2017/06/06/json-best-practice/


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末总处,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子睛蛛,更是在濱河造成了極大的恐慌鹦马,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忆肾,死亡現(xiàn)場離奇詭異荸频,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)客冈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門旭从,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事和悦⊥艘撸” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵鸽素,是天一觀的道長褒繁。 經(jīng)常有香客問我,道長付鹿,這世上最難降的妖魔是什么澜汤? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮舵匾,結(jié)果婚禮上俊抵,老公的妹妹穿的比我還像新娘。我一直安慰自己坐梯,他們只是感情好徽诲,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吵血,像睡著了一般谎替。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹋辅,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天钱贯,我揣著相機(jī)與錄音,去河邊找鬼侦另。 笑死秩命,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褒傅。 我是一名探鬼主播弃锐,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼殿托!你這毒婦竟也來了霹菊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤支竹,失蹤者是張志新(化名)和其女友劉穎旋廷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唾戚,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡柳洋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叹坦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熊镣。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绪囱,到底是詐尸還是另有隱情测蹲,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布鬼吵,位于F島的核電站扣甲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏齿椅。R本人自食惡果不足惜琉挖,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涣脚。 院中可真熱鬧示辈,春花似錦、人聲如沸遣蚀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芭梯。三九已至险耀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玖喘,已是汗流浹背甩牺。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留累奈,地道東北人柴灯。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像费尽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子羊始,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容