public HalResource deserialize( JsonElement json, Type typeOfT, JsonDeserializationContext context, Class<?> targetType) throws JsonParseException { // Das Objekt mal von Gson deserialiseren lassen HalResource result = context.deserialize(json, targetType); // Es handelt sich um ein JSON-Objekt. JsonObject jsonObject = json.getAsJsonObject(); // Nodes mit den Links und den eingebetteten Resourcen auslesen JsonObject linkRoot = jsonObject.getAsJsonObject(HalConstants.LINK_ROOT); JsonObject embeddedRoot = jsonObject.getAsJsonObject(HalConstants.EMBEDDED_ROOT); // Die Felder nach Links und eingebetteten Resourcen absuchen List<Field> fields = HalReflectionHelper.getAllFields(targetType); for (Field field : fields) { // Ist es ein Link? if (HalReflectionHelper.isLink(field) && linkRoot != null) { // Metadaten auslesen HalReferenceMetaData metaData = HalReflectionHelper.getReferenceMetaData(field); // Im JSON danach suchen JsonElement jsonField = linkRoot.get(metaData.getName()); // Wenn im JSON kein Feld gefunden wurde, müssen wir auch nichts machen if (jsonField == null) { continue; } // Wert aus dem Json zurück in das Objekt schreiben writeLink(result, field, jsonField, context); } // Ist es eine Resource? if (HalReflectionHelper.isResource(field) && embeddedRoot != null) { // Name der Resouce auslesen String resName = HalReflectionHelper.getResourceName(field); // Im JSON danach suchen JsonElement jsonField = embeddedRoot.get(resName); // Wenn im JSON kein entsprechendes Feld gefunden wurde, können wir auch nichts machen if (jsonField == null) { continue; } // Werte aus dem Json zurück ins Objekt schreiben writeResource(result, field, jsonField, context); } } return result; }
/** * Schreibt eine Referenz in einen einfachen String * * @param result Hal-Resource, in welcher sich die Referenz befindet * @param field Zu schreibendes Feld * @param jsonField JSON-Feld, welches die Referenz enthält * @param context GSON-Context für die Deserialisierung */ private void writeLinkInString( HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) { // Wir haben ein einzelne Objekt, das wir nun Deserialisieren HalReference halRef = context.deserialize(jsonField, HalReference.class); // Wert schreiben String href = halRef.getHref(); HalReflectionHelper.setValue(result, field, href); }
protected void writeLink( HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) { // Einfacher Fall: Das Feld ist ein String if (field.getType().equals(String.class)) { if (jsonField.isJsonObject()) { writeLinkInString(result, field, jsonField, context); } else if (jsonField.isJsonArray()) { // Wenn das Array nur ein Element hat, dann können wir es auch verarbeiten JsonArray jsonArray = jsonField.getAsJsonArray(); if (jsonArray.size() == 1) { writeLinkInString(result, field, jsonArray.get(0), context); } } } else if (HalReference.class.isAssignableFrom(field.getType())) { if (jsonField.isJsonObject()) { writeLinkInReference(result, field, jsonField, context); } else if (jsonField.isJsonArray()) { // Wenn das Array nur ein Element hat, können wir es auch verarbeiten JsonArray jsonArray = jsonField.getAsJsonArray(); if (jsonArray.size() == 1) { writeLinkInReference(result, field, jsonArray.get(0), context); } } } else if (Collection.class.isAssignableFrom(field.getType())) { // Wir erwarten ein JSON-Array if (jsonField.isJsonArray()) { // Collection auslesen Collection collection = (Collection) HalReflectionHelper.getValue(field, result); if (collection == null) { throw new HalDeserializingException("Collection is null; no values can be added"); } JsonArray jsonArray = jsonField.getAsJsonArray(); Iterator<JsonElement> iterator = jsonArray.iterator(); while (iterator.hasNext()) { JsonElement element = iterator.next(); writeLinkInCollection(collection, element, context); } } } }
private void writeResource( HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) { if (HalResource.class.isAssignableFrom(field.getType())) { if (jsonField.isJsonObject()) { writeEmeddedInResource(result, field, jsonField, context); } else if (jsonField.isJsonArray()) { // Wenn das Array nur ein Element hat, dann können wir es verarbeiten JsonArray jsonArray = jsonField.getAsJsonArray(); if (jsonArray.size() == 1) { writeEmeddedInResource(result, field, jsonArray.get(0), context); } } } else if (Collection.class.isAssignableFrom(field.getType())) { Collection collection = (Collection) HalReflectionHelper.getValue(field, result); // Generischer Type auslesen ParameterizedType gType = (ParameterizedType) field.getGenericType(); Type[] actualTypeArguments = gType.getActualTypeArguments(); if (collection == null) { throw new HalDeserializingException("Collection is null; no values can be added"); } // Wir erwarten ein JSON-Array if (jsonField.isJsonArray()) { JsonArray jsonArray = jsonField.getAsJsonArray(); Iterator<JsonElement> iterator = jsonArray.iterator(); while (iterator.hasNext()) { JsonElement element = iterator.next(); writeEmbeddedInCollection(collection, actualTypeArguments[0], element, context); } } else if (jsonField.isJsonObject()) { writeEmbeddedInCollection(collection, actualTypeArguments[0], jsonField, context); } } }
/** * Schreibt eine eingebettete Resource direkt ein eine {@link HalResource} * * @param result Hal-Resource, in welcher sich die eingebettete Resource befindet * @param field Zu schreibendes Feld * @param jsonField JSON-Feld, welches die Resource enthält * @param context GSON-Context für die Deserialisierung */ protected void writeEmeddedInResource( HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) { // Objekt deserialisieren Object resource = deserialize(jsonField, field.getType(), context, field.getType()); HalReflectionHelper.setValue(result, field, resource); }
/** * Schreibt eine Referenz direkt ein eine {@link HalReference} * * @param result Hal-Resource, in welcher sich die Referenz befindet * @param field Zu schreibendes Feld * @param jsonField JSON-Feld, welches die Referenz enthält * @param context GSON-Context für die Deserialisierung */ protected void writeLinkInReference( HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) { Object reference = context.deserialize(jsonField, field.getType()); HalReflectionHelper.setValue(result, field, reference); }