1. 程式人生 > >JSON 轉含有泛型屬性的物件

JSON 轉含有泛型屬性的物件

  在將 json 字串轉為物件時,如果物件含有泛型,在進行轉換時需要指明泛型型別。

1. 物件只含有一個泛型屬性時

1.1  程式碼

/**
 * @Describe:
 * @Author: chenfan
 * @Date: 2019/5/9 19:15
 */

@Data
/**
 * 含有泛型屬性的物件
 */
class OneGeneric<E>{
    E e;
    String ss;
}

@Data
/**
 * 泛型物件
 */
class KeyMessage{
    String kk;
}

public class JsonTest {

    public static void main(String[] args) {

        // {"e": {"kk":"qwe"},"ss": "ssValue"}
        String data = "{\"e\": {\"kk\":\"qwe\"},\"ss\": \"ssValue\"}";
        Gson gson = new Gson();
        //  OneGeneric : 外層物件型別    KeyMessage :巢狀的泛型型別
        OneGeneric one = gson.fromJson(data, new TypeToken<OneGeneric<KeyMessage>>() {}.getType());
        System.out.println(one);
    }

}

1.2  執行結果

正確轉換如下:

1.3 泛型屬性為集合型別時

  此時和只有一個泛型物件時處理方式一樣

public class JsonTest {

    public static void main(String[] args) {
        // {"ss": "ssValue","list":[{"dd":"dd1"},{"dd":"dd2"}]}
        String data = "{\"ss\": \"ssValue\",\"list\":[{\"dd\":\"dd1\"},{\"dd\":\"dd2\"}]}";
        Gson gson = new Gson();
        OneGeneric grandMessage = gson.fromJson(data, new TypeToken<OneGeneric<Generic>>() {}.getType());
        System.out.println(grandMessage);
    }
}

/**
 * 含有泛型屬性的物件
 */
@Data
class OneGeneric<E>{
    List<E> list;
    String ss;
}

@Data
class Generic{
    String dd;
}

2. 物件只含有多個泛型屬性時

2.1 程式碼

 

/**
 * @Describe:
 * @Author: chenfan
 * @Date: 2019/5/9 19:15
 */

@Data
/**
 * 含有多個泛型屬性的物件
 */
class GrandMessage<K,V>{

    K key;
    V value;
}

/**
 * 泛型物件
 */
@Data
class KeyMessage{
    String kk;
}

/**
 * 泛型物件
 */
@Data
class ValueMessage{
    String vv;
}

/**
 * 測試類
 */
public class JsonTest {

    public static void main(String[] args) {
        // {"key": {"kk":"qwe"},"value": {"vv":"asd"}}
        String data = "{\"key\": {\"kk\":\"qwe\"},\"value\": {\"vv\":\"asd\"}}";
        Gson gson = new Gson();
        GrandMessage grandMessage = gson.fromJson(data, new TypeToken<GrandMessage<KeyMessage,ValueMessage>>() {}.getType());
        System.out.println(grandMessage);
    }
}

2.2 執行結果

2.3 泛型的順序問題

  在進行物件轉換時, TypeToken<GrandMessage<KeyMessage,ValueMessage>> 中的泛型型別順序必須按照 GrandMessage<K,V> 中宣告的順序,否則會物件屬性全部為null

3. 泛型型別巢狀

3.1 程式碼

@Data
class GrandMessage<K>{

    K k;
    String msg;
}
@Data
class OneGeneric<E>{
    E e;
    String one;
}

@Data
class Generic{
    String dd;
}

/**
 * 測試類
 */
public class JsonTest {

    public static void main(String[] args) {
        // {"msg":"lili","k":{"one":"111","e":{"dd":"dddd"}}}
        String data = "{\"msg\":\"lili\",\"k\":{\"one\":\"111\",\"e\":{\"dd\":\"dddd\"}}}";
        Gson gson = new Gson();
        // 轉換時的泛型順序一定要嚴格按照物件的巢狀順序
        GrandMessage grandMessage = gson.fromJson(data, new TypeToken<GrandMessage<OneGeneric<Generic>>>() {}.getType());
        System.out.println(grandMessage);
    }
}

3.2 執行結果