2014-09-01 2 views
0

GsonRequest를 사용하여 데이터를 직렬화합니다. 이것은 JSON의 데이터GsonRequest에는지도를 파싱하는 데 문제가 있습니다.

이다 : 그러나 나는이 상황이

[...] 
"u": { 
     "53bde5b5e4fc4978c0000015": { 
      "la": 40.772673, 
      "lo": 9.6657388 
    }, ... 

을 그리고 난으로 데이터를 직렬화 :

(지도 그냥 동일로)

public class ClusterResult extends SingleElement{ 
    public Integer count; 
    public ClusterData[] c; 
    public HashMap<String, ClusterUnit> u; 
} 

그걸 바꾸는 방법에 대한 아이디어는? GsonRequest 클래스를 사용하여 데이터를 serialize합니다 (https://gist.github.com/ficusk/5474673).

감사합니다 :)

답변

0

왜 클래스에 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()); 
    } 

} 
+0

사용 된 코드의 실제 버전이 아니지만 정말 고맙습니다. 감사합니다. :) – Filnik

관련 문제