Skip to content

Instantly share code, notes, and snippets.

@barafael
Created June 24, 2017 21:05
Show Gist options
  • Save barafael/eac434bbdfd24eef15015da135b936fe to your computer and use it in GitHub Desktop.
Save barafael/eac434bbdfd24eef15015da135b936fe to your computer and use it in GitHub Desktop.
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