2017-01-26 1 views
0

Ich benutze Retrofit-Bibliothek für aufrufende Anfrage und Gson Konvertierer, um in das Klassenobjekt zu konvertieren. Aber API JSON Antwort nicht "klar" und ich muss einige Felder manuell korrigieren (z. B. HTML in lesbaren Text konvertieren). Aber Setter werden nicht während der Konvertierung verursacht.Setter nicht während der Konvertierung JSON zum Klassenobjekt (mit Retrofit und Gson Konverter)

Ist es bei der Erstellung der Objektmenge möglich, Feldwerte nur über ihre Setter zu setzen?

Antwort

0

Sie müssen keine Setzer/Konstruktoren setzen, Sie sollten nur Anmerkungen verwenden.

Zum Beispiel, wenn der Server-Antwort lautet wie folgt:

{ 
    "count": 12, 
    "devices": [{ 
     "adb_url": null, 
     "owner": null, 
     "ready": true, 
     "serial": "XXXXXX", 
     "model": "GT-N7100", 
     "present": true 
    }, { 
     "adb_url": null, 
     "owner": null, 
     "ready": true, 
     "serial": "XXXXXX", 
     "model": "GT-I9500", 
     "present": true 
    }] 
} 

Sie haben eine Geräteklasse und eine Devices Response-Klasse zu erstellen, wie folgt:

Geräteklasse:

import com.google.gson.annotations.SerializedName; 

public class Device { 

    @SerializedName("adb_url") 
    String adbUrl; 
    @SerializedName("owner") 
    String owner; 
    @SerializedName("ready") 
    Boolean isReady; 
    @SerializedName("serial") 
    String serial; 
    @SerializedName("model") 
    String model; 
    @SerializedName("present") 
    Boolean present; 

    public Device(String adbUrl, String owner, Boolean isReady, String serial, String model, Boolean present) { 
     this.adbUrl = adbUrl; 
     this.owner = owner; 
     this.isReady = isReady; 
     this.serial = serial; 
     this.model = model; 
     this.present = present; 
    } 

} 

Geräte Antwort Klasse:

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.SerializedName; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by avilevinshtein on 01/01/2017. 
*/ 
public class DeviceResponse { 
    @SerializedName("count") 
    int deviceSize; 

    @SerializedName("devices") 
    List<Device> deviceList; 

    public DeviceResponse() { 
     deviceSize = 0; 
     deviceList = new ArrayList<Device>(); 
    } 

    public DeviceResponse(List<Device> deviceList) { 
     this.deviceList = deviceList; 
     deviceSize = deviceList.size(); 
    } 

    public DeviceResponse(int deviceSize, List<Device> deviceList) { 
     this.deviceSize = deviceSize; 
     this.deviceList = deviceList; 
    } 

    public static DeviceResponse parseJSON(String response) { 
     Gson gson = new GsonBuilder().create(); 
     DeviceResponse deviceResponse = gson.fromJson(response, DeviceResponse.class); 
     return deviceResponse; 
    } 
} 

P.S - Ich verwendete nur Auftragnehmer für die Bequemlichkeit.

Wenn Sie eine POST-Nachricht erstellen müssen, sollten Sie auch eine DeviceRequest erstellen, die Ihre im Body der Anfrage übergebene JSON-Struktur widerspiegelt.

Beachten Sie, dass der Name in @SerializedName ("Name eines JSON-Felds") ein echter JSON-Schlüssel sein sollte.

+0

Danke für die Antwort, aber wenn ich einige Felder ändern muss, wie mache ich das? In meinem Fall bekomme ich nicht genau "klare" Daten (einige Felder enthalten HTML statt Klartext) und ich muss sie korrigieren. Natürlich kann ich sie im Getter korrigieren, aber ich möchte sie direkt im Objekt selbst korrigieren (im Moment der Erstellung des Objekts). – Mikhail

+0

@Mikhail, können Sie eine Beispielantwort teilen? Ist Ihre Antwort ein JSON-Format? –

+0

@Michail, Gson kann nur mit v2.3 (https://github.com/google/gson/issues/232) mit den Setter arbeiten. Retrofit funktioniert derzeit mit einer benutzerdefinierten Version 2.1. https://search.maven.org/#search%7Cga%7C1%7Ccom.squareup.retrofit2 Wenn Sie mit Settors arbeiten möchten, müssen Sie Jackson oder andere Konverter verwenden. Ich persönlich habe in der Vergangenheit mit Jackson gearbeitet und es hat funktioniert. –

Verwandte Themen