2017-03-21 1 views
0

Ich habe ein Unternehmen, Mitarbeiter:Deserialisieren Sie ein Realm-Objekt, das andere Realm-Objekte enthält, mit GSON?

public class Employee extends RealmObject implements Serializable { 
    @PrimaryKey 
    @SerializedName("id") public long id; 

    @SerializedName("name") public String firstName; 
    @SerializedName("lastName") public String lastName; 
    @SerializedName("profilePictureSmall") public String profilePictureSmallUrl; 
    @SerializedName("contact") public Contact contact; 
} 

public class Contact extends RealmObject implements Serializable { 
    @PrimaryKey 
    @SerializedName("id") public long id; 

    @SerializedName("workMail") public String workEmail; 
    ... Some other fields ... 
} 

Wenn Employee von json Deserialisieren alle String Felder und long Feld ordnungsgemäß deserialisiert, aber mein contact Feld ist null links.

Ich habe versucht, einen benutzerdefinierten Deserializer für Mitarbeiter schreiben:

public class DeserializeEmployee implements JsonDeserializer<Employee> { 
    @Override 
    public Employee deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     Log.d(TAG, "Deserializing Employee"); 
     Employee employee = new Employee(); 
     JsonObject o = json.getAsJsonObject(); 
     employee.id = o.get("id").getAsLong(); 
     employee.firstName = o.get("name").getAsString(); 
     employee.lastName = o.get("lastName").getAsString(); 
     employee.profilePictureSmallUrl = o.get("profilePictureSmall").getAsString(); 
     employee.contact = context.deserialize(o.get("contact"), Contact.class); 
     return employee; 
    } 
} 

und einen benutzerdefinierten Deserializer für Kontakt:

public class DeserializeContact implements JsonDeserializer<Contact> { 
    @Override 
    public Contact deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     Log.d(TAG, "Deserializing Contact"); 
     Contact contact = new Contact(); 
     JsonObject o = json.getAsJsonObject(); 
     contact.id = o.get("id").getAsLong(); 
     contact.workEmail = o.get("workMail").getAsString(); 
     return contact; 
    } 
} 

Ich habe registriere sie auch beides:

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(Date.class, (JsonSerializer<Date>) (src, typeOfSrc, context) -> new JsonPrimitive(src.getTime())) 
       .registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong())) 
       .registerTypeAdapter(Contact.class, new DeserializeContact()) 
       .registerTypeAdapter(Employee.class, new DeserializeEmployee()) 
       .create(); 

Mein Mitarbeiter-Deserializer wird aufgerufen und seine primitiven Felder sind richtig eingestellt, aber mein Kontakt-Deserializer isn 't überhaupt aufgerufen, und Feld contact ist daher null.

JSON:

{ 
    "id": 5, 
    "name": "John", 
    "lastName": "Doe", 
    "profilePictureSmall": "http://example.com/fjlsjf", 
    "contact": { 
    "id": 9, 
    "workMail": "[email protected]" 
    } 
} 

bearbeiten hinzugefügt Probe json, wenn jemand braucht, aber ziemlich sicher, dass es nicht das Problem ist.

+0

Haben Sie ein Schema für dieses JSON? – ste9206

+0

@ ste9206 Probe Json hinzugefügt. –

+1

@MarkoStojanovic Nur neugierig: Warum brauchen Sie benutzerdefinierte (De-) Serialisierer? Gson kann das gleiche mit höherer Effizienz out-of-box (es verwendet Streaming in Typ-Adapter statt JSON-Bäume voll im Speicher, die in (De-) Serialisierer verwendet werden). + Beachten Sie, dass bei Verwendung eines benutzerdefinierten (De-) Serializers die integrierten Typenadapter deaktiviert sind, sodass Ihre '@ SerializedName'-Anmerkungen keine Auswirkungen haben. –

Antwort

1

Ich sendete falsch JSON vom Server, die nicht contact Feld enthalten waren. Wenn ich tatsächlich die richtigen Daten gesendet habe, hat alles funktioniert, auch ohne benutzerdefinierte Deserializer. Entschuldigung, dass wir alle Zeit verschwenden.

0

Versuch dies zu tun:

employeeObject = realm.copyFromRealm(employeeObject); 
Verwandte Themen