diff --git a/server/implementation/src/main/java/io/smallrye/graphql/execution/ExecutionResponse.java b/server/implementation/src/main/java/io/smallrye/graphql/execution/ExecutionResponse.java index 308553aae..61971d622 100644 --- a/server/implementation/src/main/java/io/smallrye/graphql/execution/ExecutionResponse.java +++ b/server/implementation/src/main/java/io/smallrye/graphql/execution/ExecutionResponse.java @@ -159,6 +159,13 @@ private JsonValue toJsonValue(Object pojo) { final JsonValue jsonValue; if (pojo == null) { return JsonValue.NULL; + } else if (pojo instanceof JsonValue) { + JsonValue value = (JsonValue) pojo; + if (Config.get().isExcludeNullFieldsInResponses()) { + return excludeNullFields(value); + } else { + return value; + } } else if (pojo instanceof Map) { JsonObjectBuilder jsonObjectBuilder = jsonObjectFactory.createObjectBuilder(); Map map = (Map) pojo; @@ -228,6 +235,28 @@ private void popFromThePathBuffer() { } } + private static JsonValue excludeNullFields(JsonValue jsonValue) { + if (jsonValue instanceof JsonObject) { + JsonObject jsonObject = (JsonObject) jsonValue; + JsonObjectBuilder objectBuilder = jsonObjectFactory.createObjectBuilder(); + jsonObject.forEach((key, value) -> { + if (value != null && value.getValueType() != JsonValue.ValueType.NULL) { + objectBuilder.add(key, excludeNullFields(value)); + } + }); + return objectBuilder.build(); + } else if (jsonValue instanceof JsonArray) { + JsonArray jsonArray = (JsonArray) jsonValue; + JsonArrayBuilder arrayBuilder = jsonObjectFactory.createArrayBuilder(); + for (JsonValue value : jsonArray) { + arrayBuilder.add(excludeNullFields(value)); + } + return arrayBuilder.build(); + } else { + return jsonValue; + } + } + private static final String DATA = "data"; private static final String ERRORS = "errors"; private static final String EXTENSIONS = "extensions";