2016-06-17 15 views
2

Ich erhalte eine JSON Antwort von einem PHP-Server. In Androiden muss ich ein Java-Modell (POJO) schreiben, um die Antwort in Retrofit zu analysieren (eine Android-Bibliothek für http-Anfragen).Wie kann ich ein assoziatives Array mit Gson Converter in Retrofit analysieren?

JSON Struktur:

{ 
    "calendar": { 
    "2016-06-10": [ 
     { 
     "time": "10h00m", 
     "title": "PROVA P2", 
     "description": "LP/RED/ED.FIS - 80 E 90", 
     "color": "#990000" 
     } 
    ], 
    "2016-06-11": [ 
     { 
     "time": "10h00m", 
     "title": "SIMULADO", 
     "description": "LOREM PSIUM DOLOR LOREM", 
     "color": "#009900" 
     }, 
     { 
     "time": "11h00m", 
     "title": "CONSELHO DE CLASSE", 
     "description": "LOREM PSIUM DOLOR", 
     "color": "#009900" 
     } 
    ] 
    }, 
    "error": false 
} 

Diese JSON ist von PHP Server. Wie kann ich damit umgehen Retrofit?

Antwort

0

Normalerweise würden Sie ein POJO erstellen, das eine Darstellung Ihres JSON ist, aber in diesem Fall benötigen Sie eine Klasse 2016-06-10 und eine Klasse 2016-06-11.

Dies ist keine Lösung. Daher die Antwort JSON ändern Sie das Datum über einen separaten Wert zu machen:

{ 
    "calendar": [ 
    { 
     "date": "2016-06-10", 
     "entries": [ 
     { 
      "time": "10h00m", 
      "title": "PROVA P2", 
      "description": "LP/RED/ED.FIS - 80 E 90", 
      "color": "#990000" 
     } 
     ] 
    } 
    ] 
} 

Noch besser wäre es, so stellen Sie einen Datetime-Wert und machen es zu einem richtigen ISO 8601 Zeitstempel, während Sie gerade dabei sind:

{ 
    "calendar": [ 
     { 
     "time": "2016-06-10T08:00:00.000Z", 
     "title": "PROVA P2", 
     "description": "LP/RED/ED.FIS - 80 E 90", 
     "color": "#990000" 
     } 
    ] 
} 

Wenn Sie keine Kontrolle über den Server haben, der den JSON bedient, sollten Sie Retrofit verwenden, um nur einen String zu erhalten und die Gson-Konvertierung selbst über gson durchzuführen.

0

Was ich mache, wenn ich keine für eine seltsame Antwort vom Server erstellen möchte, halte es als JSON in Java und parse die Zeichenfolge, um ein JSON-Objekt zu erstellen. (Ja, denn manchmal können wir einfach nicht, was der Typ API steuern Kodierung ...)

Als Cristan sagte, wäre es seltsam, eine 2016-06-10 Klasse zu erstellen. Also, besser behandeln Sie es direkt als JSON Objekt für diesen speziellen Fall. Sie können mit einem JSON-Container auf ein beliebiges Attribut zugreifen und es sogar auf diese Weise in einer Datenbank speichern.

Was müssen Sie tun, wenn Sie diesen Weg wählen:

private String sendAlert(String lat, String lon) throws IOException, JSONException { 

    Call<ResponseBody> call = cougarServices.postAlert(lat, lon); 
    ResponseBody response = call.execute().body(); 
    JSONObject json = (response != null ? new JSONObject(response.string()) : null); 
    return handleJsonRequest(json); 

} 
1

Um JSON mit dynamischen Tasten zu analysieren, werden Sie eine Map in Ihrer POJO Klasse benötigen.

Fügen Sie die folgenden POJO Klassen zu einem Projekt:

  1. CalendarResponse.java

    public class CalendarResponse { 
        @SerializedName("calendar") 
        Map<String, List<Entry>> entries; 
    
        @SerializedName("error") 
        private boolean error; 
    } 
    
  2. Entry.java

    public class Entry { 
        @SerializedName("time") 
        private String time; 
    
        @SerializedName("title") 
        private String title; 
    
        @SerializedName("description") 
        private String description; 
    
        @SerializedName("color") 
        private String color; 
    } 
    
  3. Verwenden Sie die CalendarResponse-Klasse im Retrofit-Schnittstelle für Ihre siehe Endpunkt, zB unter

    public interface CalendarService { 
        @GET("<insert your own relative url>") 
        Call<CalendarResponse> listCalendar(); 
    } 
    
  4. den Anruf ausführen (synchron) wie folgt:

    Call<CalendarResponse> call = calendarService.listCalendar(); 
    CalendarResponse result = call.execute().body(); 
    

Falls erforderlich, hier ist ein Beispiel für die JSON mit GSON zu analysieren:

Gson gson = new GsonBuilder().create(); 
CalendarResponse b = gson.fromJson(json, CalendarResponse.class); 
Verwandte Themen