2017-03-07 30 views
0

ネストされたJSONを各クラスのTypeAdapterの実装を持つネストされたJavaオブジェクトに変換するには、google gson TypeAdapterを使用しようとしています。しかし、私は単一のアダプタクラスで完全なread()メソッドロジックを記述したくありません。私はネット上でいくつかの質問とblogの例を紹介しました。しかし、完全な読取りロジックは単一クラスにあります。gson TypeAdapterを使用してネストされたJSONをネストされたJavaオブジェクトに変換

小さいネストされたオブジェクトの場合、単一のアダプターでロジックを持つことはできますが、大きなオブジェクト(各クラスに10-15個以上のフィールドを持つ)ではうまくいかない場合があります。たとえば、JSONのキーについては

[更新]

クラス属性のと同じように見えますが、実際に私がhyphen-separated-small-caseキーの代わりに、Camel caseキーとして入力を取得します。だから、私のjsonとjavaクラスの属性名は同じではないので、私はマッピングのための私のカスタムロジックを書く必要があります。

など。 サンプル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; 
    .. 
} 

私は2つの異なるアダプターを持って、リードに()メソッドを複数のアダプタを統合したいです。

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マッピングが必要なように見えます。タイプアダプタは実際には過剰です。「final Employee employee = 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

私は同じ問題を抱えていて、適切な解決策を見つけました。

TypeAdapter<T>インスタンスは、GsonオブジェクトとそのメソッドgetAdapter(Class<T> type)の助けを借りて得ることができます。

だからあなたの提供の例では、次のようになります。

の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注釈の唯一の依存関係のためです。
追加すると、各Beanの読み取り/書き込みロジックを独自のTypeAdapterに分割します。

関連する問題