Gson映射Lat/Lng类

Sai*_*sin 0 java android google-maps-api-3 gson

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

{
    "sw": {
        "latitude": 12.283139573692,
        "longitude": 76.623518155689
    },
    "ne": {
        "latitude": 12.30112600581,
        "longitude": 76.651167163598
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*aud 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());
}
Run Code Online (Sandbox Code Playgroud)

你必须配置你的gson使用这个反序列化器

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(LatLng.class, new LatLngDeserializer());
Gson gson = gsonBuilder.create();
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用从服务器解析lat/long对象

LatLng latlng = gson.fromJson(jsonInput, LatLng.class); 
Run Code Online (Sandbox Code Playgroud)

这里jsonInput看起来像

{
  "lat" : 0.0,
  "lng" : 0.0
}
Run Code Online (Sandbox Code Playgroud)

你也可以看到这个帖子