Fix type resolution for fields with null and non-null values

Closes gh-398
This commit is contained in:
Andy Wilkinson
2017-09-23 15:43:42 +01:00
parent a123e06d06
commit 4854bc949f
4 changed files with 122 additions and 24 deletions

View File

@@ -107,7 +107,7 @@ class JsonContentHandler implements ContentHandler {
@Override
public Object determineFieldType(FieldDescriptor fieldDescriptor) {
if (fieldDescriptor.getType() == null) {
return this.fieldTypeResolver.resolveFieldType(fieldDescriptor.getPath(),
return this.fieldTypeResolver.resolveFieldType(fieldDescriptor,
readContent());
}
if (!(fieldDescriptor.getType() instanceof JsonFieldType)) {
@@ -116,7 +116,7 @@ class JsonContentHandler implements ContentHandler {
JsonFieldType descriptorFieldType = (JsonFieldType) fieldDescriptor.getType();
try {
JsonFieldType actualFieldType = this.fieldTypeResolver
.resolveFieldType(fieldDescriptor.getPath(), readContent());
.resolveFieldType(fieldDescriptor, readContent());
if (descriptorFieldType == JsonFieldType.VARIES
|| descriptorFieldType == actualFieldType
|| (fieldDescriptor.isOptional()

View File

@@ -28,8 +28,8 @@ class JsonFieldTypeResolver {
private final JsonFieldProcessor fieldProcessor = new JsonFieldProcessor();
JsonFieldType resolveFieldType(String path, Object payload) {
JsonFieldPath fieldPath = JsonFieldPath.compile(path);
JsonFieldType resolveFieldType(FieldDescriptor fieldDescriptor, Object payload) {
JsonFieldPath fieldPath = JsonFieldPath.compile(fieldDescriptor.getPath());
Object field = this.fieldProcessor.extract(fieldPath, payload);
if (field instanceof Collection && !fieldPath.isPrecise()) {
JsonFieldType commonType = null;
@@ -38,8 +38,16 @@ class JsonFieldTypeResolver {
if (commonType == null) {
commonType = fieldType;
}
else if (fieldType != commonType && fieldType != JsonFieldType.NULL) {
return JsonFieldType.VARIES;
else if (fieldType != commonType) {
if (!fieldDescriptor.isOptional()) {
return JsonFieldType.VARIES;
}
if (commonType == JsonFieldType.NULL) {
commonType = fieldType;
}
else if (fieldType != JsonFieldType.NULL) {
return JsonFieldType.VARIES;
}
}
}
return commonType;