2014-09-01 1 views
0

J'utilise GsonRequest pour sérialiser mes données. Cependant, j'ai cette situation:GsonRequest a des problèmes pour analyser une carte

Ce sont les données en JSON:

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

Et je sérialiser les données avec:

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

(avec carte est la même)

Une idée de comment changer cela? J'utilise la classe GsonRequest pour sérialiser les données (https://gist.github.com/ficusk/5474673).

Merci :)

Répondre

0

Pourquoi ne pas essayer d'envelopper votre ClusterUnit dans une classe et d'utiliser un sérialiseur personnalisé ?. Peut-être que je ne comprends pas votre problème, si c'est comme ça, faites le moi savoir. Voici comment je l'ai fait:

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

ce n'est pas la version actuelle du code que j'ai utilisé, mais c'était vraiment inspirant, merci! :) – Filnik

Questions connexes