2017-09-08 6 views
1

mon équipe de serveur définit une réponse terrible, qui peut être un objet json comme {key1=value1, key2=value2}, et peut être un tableau json comme [{key3=value3, key4=value4}, {key3=value3a, key4=value4a}].Retrofit/GSON: comment gérer la réponse avec les deux types: objet JSON et tableau JSON?

les deux types a relation logique comme suit: pour une API unique, le serveur:

  • envoyer objet JSON s'il y a une erreur, ou
  • envoyer tableau JSON s'il y a des données valides.

Je ne peux pas leur dire de changer cela parce que cette réponse est utilisée par d'autres fins comme PC et iOS. Alors, que dois-je faire de cette réponse en quatre lettres? J'utilise retrofit pour le réseau et GSON pour la désérialisation de réponse.

Répondre

1
static class Entity { 
    String name; 
    // other fields 
} 

static class Error { 
    String errorName; 
    // other fields 
} 

public static void main(String[] args) throws Exception { 
    // no error 
    String jsonString = "[{'name': 'one'}, {'name': 'two'}]"; 
    // error 
    // String jsonString = "{'errorName': 'Not Found'}"; 

    Gson gson = new Gson(); 
    JsonElement jsonElement = new JsonParser().parse(jsonString); 
    if (jsonElement.isJsonArray()) { 
     // no error 
     Entity[] entities = gson.fromJson(jsonElement, Entity[].class); 
     System.out.println(entities[0].name); 
    } else if (jsonElement.isJsonObject()) { 
     // error 
     Error error = gson.fromJson(jsonElement, Error.class); 
     System.out.println(error.errorName); 
    } else { 
     throw new IOException("Server response is not jsonElement array or jsonElement object"); 
    } 
}