サーバーと通信するために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 つのメタデータ クラスを作成MetadataExternal
しMetadataInternal
、サーバーへの受信と送信に使用する必要がありますか?