2017-07-07 1 views
-1

J'ai une réponse JSON:Comment diviser un objet JSON en une liste (GSON, Android)?

{ 
    "address": "0a1ac9b9a342c3600995845eec7254df664d6aa9", 
    "workers": { 
    "desktop-380h0l6": { 
     "worker": "desktop-380h0l6", 
     "hashrate": "92.2 MH/s", 
     "reportedHashRate": "81.6 MH/s", 
     "validShares": 81, 
     "invalidShares": 0, 
     "staleShares": 3, 
     "workerLastSubmitTime": 1499408997, 
     "invalidShareRatio": 0 
    }, 
    "eco-001": { 
     "worker": "eco-001", 
     "hashrate": "121.1 MH/s", 
     "reportedHashRate": "130.1 MH/s", 
     "validShares": 109, 
     "invalidShares": 0, 
     "staleShares": 0, 
     "workerLastSubmitTime": 1499408985, 
     "invalidShareRatio": 0 
    }, 
    "eco-002": { 
     "worker": "eco-002", 
     "hashrate": "114.1 MH/s", 
     "reportedHashRate": "108.5 MH/s", 
     "validShares": 102, 
     "invalidShares": 0, 
     "staleShares": 1, 
     "workerLastSubmitTime": 1499408993, 
     "invalidShareRatio": 0 
    }, 
    "eco-003": { 
     "worker": "eco-003", 
     "hashrate": "125.5 MH/s", 
     "reportedHashRate": "129.6 MH/s", 
     "validShares": 111, 
     "invalidShares": 0, 
     "staleShares": 3, 
     "workerLastSubmitTime": 1499408969, 
     "invalidShareRatio": 0 
    } 
} 

J'ai besoin de diviser l'objet « travailleurs » dans la liste. Comment puis-je faire ceci? Dans mon projet j'utilise Retrofit avec GSON. Je pensais que ce code m'aiderait, mais je me suis trompé:

public class WorkersDeserializer implements JsonDeserializer<Workers> { 
    @Override 
    public Workers deserialize(JsonElement json, 
              Type typeOfT, 
              JsonDeserializationContext context) throws JsonParseException { 

     final JsonObject jsonObject = json.getAsJsonObject(); 
     List<Worker> list = new LinkedList<>(); 
     jsonObject.entrySet().forEach(new Consumer<Map.Entry<String, JsonElement>>() { 
      @Override 
      public void accept(Map.Entry<String, JsonElement> stringJsonElementEntry) { 
       list.add(context.deserialize(stringJsonElementEntry.getValue(), Workers.class)); 
      } 
     }); 

     Workers w =new Workers(); 
     w.setWorkers(list); 
     return w; 
    } 
} 

Nous vous remercions de votre aide.

+0

Avez-vous le contrôle de la source JSON? Si oui, faire un tableau à 'workers' sera beaucoup plus facile. La clé n'est pas nécessaire car elle est déjà dans l'objet. – Joshua

+0

@Joshua Malheureusement, je n'ai pas un tel contrôle. Avez-vous des idées sur la façon de diviser? –

Répondre

0

Pourquoi ne pas le désérialiser à Map puis collecter ses valeurs dans une liste?

Workers.java:

public class Workers { 
    @SerializedName("address") 
    private String mAddress; 

    @SerializedName("workers") 
    private Map<String, Worker> mWorkers; 

    /* ... */ 
} 

Et puis:

Workers workers = new Gson().fromJson(json, Workers.class); 
List<Worker> = new ArrayList<>(workers.getWorkers().values());