Esempio n. 1
0
  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;
  }