Gson映射Lat / Lng类

时间:2015-10-12 06:37:17

标签: java android google-maps-api-3 gson

我的服务器返回一个像这样的json对象:

{
    "sw": {
        "latitude": 12.283139573692,
        "longitude": 76.623518155689
    },
    "ne": {
        "latitude": 12.30112600581,
        "longitude": 76.651167163598
    }
}

我的Gson课程是

import com.google.android.gms.maps.model.LatLng;

/**
 * Created by Moz on 12/10/15.
 */
public class Box {
    LatLng ne;
    LatLng sw;

    public LatLng getNorthEast() {
        return ne;
    }

    public LatLng getSouthWest() {
        return sw;
    }

}

在这种情况下它可以正常工作,因为com.google.android.gms.maps.model下的LatLng类使用名称作为纬度,经度。但是,我宁愿让我的服务器响应为lat,lng,因为它在发送大量latlng对象时节省了空间。这里的问题是,由于这个LatLng对象是Google库的一部分,我无法添加字段映射名称注释。我想继续使用原始谷歌的LatLng类,但同时允许服务器返回较小的响应,即lat,lng。如何实现这一目标?

1 个答案:

答案 0 :(得分:5)

您是否尝试编写自己的反序列化程序?你应该尝试这样的事情(未经测试)。

public class LatLngDeserializer implements JsonDeserializer<LatLng> {

  @Override
  public LatLngdeserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
      throws JsonParseException {

    JsonObject jobject = json.getAsJsonObject();

    return new LatLng(
        jobject.get("lat").getAsDouble(), 
        jobject.get("lng").getAsDouble());
}

您必须使用

配置gson以使用此反序列化程序
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(LatLng.class, new LatLngDeserializer());
Gson gson = gsonBuilder.create();

现在,您可以使用

解析服务器中的lat / long对象
LatLng latlng = gson.fromJson(jsonInput, LatLng.class); 

jsonInput看起来像

{
  "lat" : 0.0,
  "lng" : 0.0
}

您还可以看到此thread