왜 클래스에 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