你爲什麼不嘗試換你ClusterUnit
在一類和使用自定義解串器?也許我不明白你的問題,如果是這樣,讓我知道。這是我做的:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.Map;
/**
*
* @author astinx
*/
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Test().run();
}
public class ClusterUnitWrapped {
String id; //53bde5b5e4fc4978c0000015
Double la;
Double lo;
private ClusterUnitWrapped(String id, Double la, Double lo) {
this.id = id; this.la = la; this.lo = lo;
}
@Override
public String toString() {
return "ClusterUnitWrapped{" + "id=" + id + ", la=" + la + ", lo=" + lo + '}';
}
}
public class ClusterUnitRequest {
//...
ClusterUnitWrapped u;
//...
@Override
public String toString() {
return "ClusterUnitRequest{" + "u=" + u + '}';
}
}
private class ClusterUnitDeserializer implements JsonDeserializer<ClusterUnitWrapped> {
public ClusterUnitWrapped deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
for (Map.Entry<String, JsonElement> map : json.getAsJsonObject().entrySet()) {
String id = map.getKey().toString(); //Obviously is going to iterate only once.
Double la = map.getValue().getAsJsonObject().get("la").getAsDouble();
Double lo = map.getValue().getAsJsonObject().get("lo").getAsDouble();
return new ClusterUnitWrapped(id, la, lo);
}
return null;
}
}
private void run() {
String json = "{\"u\":{\"53bde5b5e4fc4978c0000015\": { \"la\": 40.772673, \"lo\":9.6657388}}}";
Gson gson = new GsonBuilder()
.registerTypeAdapter(ClusterUnitWrapped.class, new ClusterUnitDeserializer())
.create();
ClusterUnitRequest u = gson.fromJson(json, ClusterUnitRequest.class);
System.out.println(u.toString());
}
}
這不是我使用的代碼的實際版本,但它真的很鼓舞人心,謝謝! :) – Filnik 2014-09-02 00:38:09