009.使用Jackson講JSON格式字符串轉LIST寫法

Jackson處理一般的JavaBean和Json之間的轉換只要使用ObjectMapper 對象的readValue和writeValueAsString兩個方法就能實現(xiàn)。但是如果要轉換復雜類型Collection如 List<YourBean>,那么就需要先反序列化復雜類型 為泛型的Collection Type阎肝。

  • 如果是ArrayList<YourBean>那么使用ObjectMapper 的getTypeFactory().constructParametricType(collectionClass, elementClasses);
  • 如果是HashMap<String,YourBean>那么 ObjectMapper 的getTypeFactory().constructParametricType(HashMap.class,String.class, YourBean.class);
public final ObjectMapper mapper = new ObjectMapper(); 
     
    public static void main(String[] args) throws Exception{  
        JavaType javaType = getCollectionType(ArrayList.class, YourBean.class); 
        List<YourBean> lst =  (List<YourBean>)mapper.readValue(jsonString, javaType); 
    }   
       /**   
        * 獲取泛型的Collection Type  
        * @param collectionClass 泛型的Collection   
        * @param elementClasses 元素類   
        * @return JavaType Java類型   
        * @since 1.0   
        */   
    public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {   
        return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);   
    }

我的代碼測試如下:

public class Object2JSON互轉 {

    public static void main( String[] args ) throws IOException {

        Student student = new Student();
        student.setAccount("wukong");
        student.setUserName("悟空");
        //Jaskson工具類
        ObjectMapper objectMapper = new ObjectMapper();

        // 1.將Java對象轉換為JSON格式的字符串
        String jsonStr = objectMapper.writeValueAsString(student);
        System.out.println("Student轉JSON格式字符串:"+jsonStr);

        //2.將JSON格式的字符串轉換Java對象
        Student shxt = objectMapper.readValue(jsonStr, Student.class);
        System.out.println("JSON格式字符串轉Student對象:"+shxt);

        System.out.println("==============================================");
        List<Student> studentList = new ArrayList<Student>();
        studentList.add(student);

        student = new Student();
        student.setAccount("bajie");
        student.setUserName("八戒");
        studentList.add(student);
        jsonStr = objectMapper.writeValueAsString(studentList);
        System.out.println("StudentList轉JSON格式字符串:"+jsonStr);

        JavaType t  = objectMapper.getTypeFactory().constructParametricType(List.class, Student.class);
        List<Student> shxtList = objectMapper.readValue(jsonStr, t);
        System.out.println("JSON格式字符串轉shxtList集合:"+shxtList);

        List<Map<String,Object>> mapList = objectMapper.readValue(jsonStr, List.class);
        System.out.println("JSON格式字符串轉mapList集合:"+mapList);
    }

}

簡單封裝工具類,在Java Web階段也許用到

public class JsonUtil {

    /**
     * 將對象轉換為json字符串
     * 
     * @param obj
     * @return
     * @throws Exception
     */
    public static String obj2string(Object obj) {
        StringWriter sw = new StringWriter();
        ObjectMapper mapper = new ObjectMapper();
        try {
            mapper.writeValue(sw, obj);
        } catch (Exception e) {
        }
        return sw.toString();
    }

    /**
     * 將字符串轉list對象
     * 
     * @param <T>
     * @param jsonStr
     * @param cls
     * @return
     */
    public static <T> List<T> str2list(String jsonStr, Class<T> cls) {
        ObjectMapper mapper = new ObjectMapper();
        List<T> objList = null;
        try {
            JavaType t = mapper.getTypeFactory().constructParametricType(
                    List.class, cls);
            objList = mapper.readValue(jsonStr, t);
        } catch (Exception e) {
        }
        return objList;
    }

    /**
     * 將字符串轉為對象
     * 
     * @param <T>
     * @param jsonStr
     * @param cls
     * @return
     */
    public static <T> T str2obj(String jsonStr, Class<T> cls) {
        ObjectMapper mapper = new ObjectMapper();
        T obj = null;
        try {
            obj = mapper.readValue(jsonStr, cls);
        } catch (Exception e) {
        }
        return obj;
    }
    
    /**
     * 將字符串轉為Page對象
     * 
     * @param <T>
     * @param jsonStr
     * @param cls
     * @return
     */
    public static <T> Page<T> str2page(String jsonStr, Class<T> cls) {
        ObjectMapper mapper = new ObjectMapper();
        Page<T> objList = null;
        try {
            JavaType t = mapper.getTypeFactory().constructParametricType(
                    Page.class, cls);
            objList = mapper.readValue(jsonStr, t);
        } catch (Exception e) {
        }
        return objList;
    }
    
    /**
     * 將字符串轉為json節(jié)點
     * @param jsonStr
     * @return
     */
    public static JsonNode str2node(String jsonStr) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readTree(jsonStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂教,一起剝皮案震驚了整個濱河市倾剿,隨后出現(xiàn)的幾起案子窜锯,更是在濱河造成了極大的恐慌艘刚,老刑警劉巖管宵,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攀甚,居然都是意外死亡箩朴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門秋度,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炸庞,“玉大人,你說我怎么就攤上這事荚斯〔壕樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵事期,是天一觀的道長滥壕。 經(jīng)常有香客問我,道長刑赶,這世上最難降的妖魔是什么捏浊? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任懂衩,我火速辦了婚禮撞叨,結果婚禮上,老公的妹妹穿的比我還像新娘浊洞。我一直安慰自己牵敷,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布法希。 她就那樣靜靜地躺著枷餐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苫亦。 梳的紋絲不亂的頭發(fā)上毛肋,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音屋剑,去河邊找鬼润匙。 笑死,一個胖子當著我的面吹牛唉匾,可吹牛的內(nèi)容都是我干的孕讳。 我是一名探鬼主播匠楚,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厂财!你這毒婦竟也來了芋簿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤璃饱,失蹤者是張志新(化名)和其女友劉穎与斤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荚恶,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡幽告,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了裆甩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冗锁。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嗤栓,靈堂內(nèi)的尸體忽然破棺而出冻河,到底是詐尸還是另有隱情,我是刑警寧澤茉帅,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布叨叙,位于F島的核電站,受9級特大地震影響堪澎,放射性物質(zhì)發(fā)生泄漏擂错。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一樱蛤、第九天 我趴在偏房一處隱蔽的房頂上張望钮呀。 院中可真熱鬧,春花似錦昨凡、人聲如沸爽醋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚂四。三九已至,卻和暖如春哪痰,著一層夾襖步出監(jiān)牢的瞬間遂赠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工晌杰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跷睦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓乎莉,卻偏偏與公主長得像送讲,于是被迫代替她去往敵國和親奸笤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 1. Java基礎部分 基礎部分的順序:基本語法哼鬓,類相關的語法监右,內(nèi)部類的語法,繼承相關的語法异希,異常的語法健盒,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用。 當JAVA程序違反了JA...
    八爺君閱讀 4,574評論 1 114
  • Jackson使用規(guī)范以及代碼示例 依賴包 Maven依賴: org.codehaus.jackson jacks...
    山石水壽閱讀 4,648評論 0 3
  • 1 在了解“假性親密關系”之前,我一直想不明白Nana和左先生分手的原因憨降。我和左先生接觸不多父虑,但因為他是Nana的...
    小胸喵閱讀 367評論 5 1
  • 八月二十二日 天氣雨轉晴 順順開學了,長達兩個半月的暑期生活授药,今天正式結束了 全家人...
    盼之閱讀 355評論 0 0