1

サーバーと通信するためにRetrofitライブラリとParcelerライブラリを使用しています。

サーバーには、次の 2 つの API メソッドがあります。

/api/metadata/{id}次の JSON を返すGET

{
     "id": 1,
     "active": true,
     "location": {
         "type": "Point",
         "coordinates": [
             30.0000,
             30.0000
         ]
     }
}

次の JSON を期待する POST /api/metadata/{id}

{
     "id": 1,
     "active": true,
     "location_latitude": 30.0000,
     "location_longitude": 30.0000
}

それは歴史的な理由によるものであり、変えることはできません。

私の Android アプリケーションでは、次の方法で Retrofit を宣言します。

public interface ServerApi {
    @GET("/api/metadata/{id}")
    Metadata getMetadata(@Path("id") int id);

    @POST("/api/metadata/{id}")
    Metadata updateMetadata(@Path("id") int id, @Body Metadata metadata);
}

パーセル クラスは次のように定義されます。

メタデータ:

@Parcel
public class Metadata {
    @SerializedName("id")
    private Integer id;

    @SerializedName("location")
    private GeometryPoint location;

    @SerializedName("location_latitude")
    private float locationLatitude;

    @SerializedName("location_longitude")
    private float locationLongitude;

    public void setId(Integer id) {
        this.id = id;
    }

    public void setLocationLatitude(float locationLatitude) {
        this.locationLatitude = locationLatitude;
    }

    public void setLocationLongitude(float locationLongitude) {
        this.locationLongitude = locationLongitude;
    }

    public void setLocation(GeometryPoint location) {
        this.location = location;
    }

    public Integer getId() {
        return id;
    }

    public float getLocationLatitude() {
        return locationLatitude;
    }

    public float getLocationLongitude() {
        return locationLongitude;
    }

    public GeometryPoint getLocation() {
        return location;
    }
}

ジオメトリポイント:

@Parcel
public class GeometryPoint {
    @SerializedName("type")
    private String type;

    @SerializedName("coordinates")
    private float[] coordinates;

    public void setType(String type) {
        this.type = type;
    }

    public void setCoordinates(float[] coordinates) {
        this.coordinates = coordinates;
    }

    public String getType() {
        return type;
    }

    public float[] getCoordinates() {
        return coordinates;
    }
}

アプリケーション全体で Metadata クラスを使用したいと考えています。サーバーにクエリを実行し、メタデータを受信して​​更新し、サーバーに送信したいと考えています。明らかに、GET と POST ではメタデータの形式が異なります。そのため、GET を受け取った時点で POST 形式に変換してもらいたいと考えています。

私の質問は、Retrofit と Parceler がlocationパラメータを認識し、JSON からデシリアライズするが、'location_latitude' と 'location_longitude' に分解できるメソッドをMetadata介してクラスに書き込むことができるように、注釈を何らかの方法で宣言できるかどうかです。setLocation()

これは、目的のメタデータ クラスの擬似コードです。

@Parcel
public class Metadata {
    @SerializedName("id")
    private Integer id;

    // I'd like not having location variable defined at all 
    // but use some annotation magic :)) to tell GSON to deserialize
    // JSON and call setLocation() when it tries to process location
    // parameter of the server response
    /*
       @SerializedName("location")
       private GeometryPoint location;
    */

    @SerializedName("location_latitude")
    private float locationLatitude;

    @SerializedName("location_longitude")
    private float locationLongitude;

    public void setId(Integer id) {
        this.id = id;
    }

    public void setLocationLatitude(float locationLatitude) {
        this.locationLatitude = locationLatitude;
    }

    public void setLocationLongitude(float locationLongitude) {
        this.locationLongitude = locationLongitude;
    }

    public void setLocation(GeometryPoint location) {
        this.location_latitude = location.getCoordinates()[1];
        this.location_longitude = location.getCoordinates()[0];
    }

    public Integer getId() {
        return id;
    }

    public float getLocationLatitude() {
        return locationLatitude;
    }

    public float getLocationLongitude() {
        return locationLongitude;
    }

    // No need for getLocation method
}

それとも、私はばかげているだけなのでしょうか (昨日、Retrofit、Parceler、および GSON 認識を文字通り取り上げました)、2 つのメタデータ クラスを作成MetadataExternalMetadataInternal、サーバーへの受信と送信に使用する必要がありますか?

4

0 に答える 0