Created
June 24, 2017 21:05
-
-
Save barafael/eac434bbdfd24eef15015da135b936fe to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ModelSerializer implements JsonSerializer<FHEMModel> { | |
private final List<String> permissions; | |
public ModelSerializer(List<String> permissions) { | |
this.permissions = permissions; | |
} | |
@Override | |
public JsonElement serialize(FHEMModel model, Type type, JsonSerializationContext jsc) { | |
/* All the other adapters set non-permitted or empty fields to null */ | |
JsonObject jObj = (JsonObject) new GsonBuilder() | |
.registerTypeAdapter(FHEMFileLog.class, new FilelogSerializer(permissions)) | |
.registerTypeAdapter(FHEMSensor.class, new SensorSerializer(permissions)) | |
.registerTypeAdapter(FHEMRoom.class, new RoomSerializer(permissions)) | |
.create() | |
.toJsonTree(model); | |
if (!model.hasPermittedRooms(permissions)) { | |
return JsonNull.INSTANCE; | |
} | |
cleanNull(jObj); | |
return jObj; | |
} | |
private void cleanNull(JsonElement element) { | |
if (element.isJsonNull()) { | |
System.err.println("JsonElement which is instance of JsonNull was not removed!"); | |
} else if (element.isJsonArray()) { | |
JsonArray arr = element.getAsJsonArray(); | |
ArrayList<JsonElement> toDelete = new ArrayList<>(); | |
for (JsonElement arr_elem : arr) { | |
if (arr_elem.isJsonNull()) { | |
toDelete.add(arr_elem); | |
} else { | |
cleanNull(arr_elem); | |
} | |
} | |
toDelete.forEach(arr::remove); | |
} else if (element.isJsonObject()) { | |
JsonObject jsonObject = element.getAsJsonObject(); | |
HashSet<String> toDelete = new HashSet<>(); | |
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) { | |
if (entry.getValue().isJsonNull()) { | |
toDelete.add(entry.getKey()); | |
} else { | |
cleanNull(entry.getValue()); | |
} | |
} | |
toDelete.forEach(jsonObject::remove); | |
} else if (element.isJsonPrimitive()) { | |
JsonPrimitive prim = element.getAsJsonPrimitive(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment