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.
Haben Sie ein Schema für dieses JSON? – ste9206
@ ste9206 Probe Json hinzugefügt. –
@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. –