2017-03-07 110 views
0

我正嘗試使用google gson TypeAdapter將嵌套的JSON轉換爲嵌套的Java對象,併爲每個類實現了TypeAdapter。但我不想在單個適配器類中編寫完整的read()方法邏輯。我已經通過網絡提到了幾個問題和blog例子。但是完整的讀取邏輯是單獨的。使用gson將嵌套的JSON轉換爲嵌套的Java對象TypeAdapter

對於小型嵌套對象,它可以在單個Adapter中使用邏輯,但對於大對象(每個類中有超過10-15個字段),這並不好。

[更新]

例如JSON鍵看起來相同的類屬性,但在實際我會得到輸入爲hyphen-separated-small-case鍵,而不是Camel case鍵。所以我的json和java類屬性名稱將不會相同,因此我必須編寫我的定製邏輯進行映射。

E.g. 樣品的Json輸入:

{ 
    "id": 1, 
    "name": "Alex", 
    "emailId": "[email protected]", 
    "address": { 
    "address": "21ST & FAIRVIEW AVE", 
    "district": "district", 
    "city": "EATON", 
    "region": "PA", 
    "postalCode": "18044", 
    "country": "US" 
    } 
} 

而Java Bean是如下:

//Employee object class 
public class Employee { 

    private int id; 
    private String name; 
    private String emailId; 
    private Address address; 
    .. 
} 

//Address object class 
public class Address { 

    private String address; 
    private String district; 
    private String city; 
    private String region; 
    private String postalCode; 
    private String country; 
    .. 
} 

我想有兩個不同的適配器和在讀集成多個適配器()方法。

public class EmployeeAdapter extends TypeAdapter<Employee> { 
    @Override 
    public void write(JsonWriter out, Employee employee) throws IOException { 
    // 
    } 

    @Override 
    public Employee read(JsonReader jsonReader) throws IOException { 
    //read logic for employee class using AddressAdapter for address json 
    } 
} 

public class AddressAdapter extends TypeAdapter<Address> { 
    @Override 
    public void write(JsonWriter out, Address address) throws IOException { 
    // 
    } 

    @Override 
    public Address read(JsonReader jsonReader) throws IOException { 
    //read logic for Address class 
    } 
} 

如何在EmployeeAdapter中使用AddressAdapter?

+2

您是否嘗試過使用閱讀器的默認實現?或者你有特定的理由來編寫自己的適配器? –

+0

這與傑克遜有什麼關係?請刪除標籤 –

+2

它看起來像你只需要POJO映射,而類型適配器真的是一個矯枉過正的地方:'最終員工僱員= gson.fromJson(...,Employee.class)'似乎是完整的。 –

回答

0

您可以創建封裝在EmployeeAdapter中的AddressAdapter的新實例。請通過以下示例。

public class EmployeeAdapter extends TypeAdapter<Employee> { 
    //private instance of address adapter 
    private AddressAdapter addressAdapter = new AddressAdapter(); 

    @Override 
    public void write(JsonWriter out, Employee employee) throws IOException { 
     //TODO: do your stuff to Employee class 

     //manually do it to Address class 
     addressAdapter.write(out, employee.getAddress()); 
    } 

    @Override 
    public Employee read(JsonReader jsonReader) throws IOException { 
     //your new instance of employee 
     Employee employee = new Employee(); 

     //TODO: read logic for employee class using AddressAdapter for address json 

     //read from Address class 
     Address address = addressAdapter.read(jsonReader);//you may need only portion of address available, simply grab that string as same as other properties if needed 
     employee.setAddress(address); 
    } 
} 
+0

這沒關係。但是在AddressAdapter中不會使用'TypeAdapter

'。 – GovindS

1

我有同樣的問題,並找到適合我的解決方案。

您可以在Gson對象及其方法getAdapter(Class<T> type)的幫助下獲得新的TypeAdapter<T>實例。

所以您提供的例子應該是這樣的:

Java組件:

//Employee object class 
@JsonAdapter(EmployeeAdapter.class) 
public class Employee { 

    private int id; 
    private String name; 
    private String emailId; 
    private Address address; 
    .. 
} 

//Address object class 
@JsonAdapter(AddressAdapter.class) 
public class Address { 

    private String address; 
    private String district; 
    private String city; 
    private String region; 
    private String postalCode; 
    private String country; 
    .. 
} 

型適配器:

public class EmployeeAdapter extends TypeAdapter<Employee> { 
    @Override 
    public void write(JsonWriter out, Employee employee) throws IOException { 
    // 
    } 

    @Override 
    public Employee read(JsonReader jsonReader) throws IOException { 
    Employee employee = new Employee(); 

    jsonReader.beginObject(); 
    //read your Employee fields 

    TypeAdapter<Address> addressAdapter = new Gson().getAdapter(Address.class); 
    employee.setAddress(addressAdapter.read(jsonReader); 

    return employee; 
    } 
} 

public class AddressAdapter extends TypeAdapter<Address> { 
    @Override 
    public void write(JsonWriter out, Address address) throws IOException { 
    // 
    } 

    @Override 
    public Address read(JsonReader jsonReader) throws IOException { 
    Address address = new Address(); 
    //read your Address fields 
    return address; 
    } 
} 

有了這個解決方案,您有一個鬆耦合代碼的好處,因爲Beans JsonAdapter註釋中唯一的依賴。
Addtional將每個Bean的讀/寫邏輯分配給它自己的TypeAdapter。