Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,27 @@
import com.fasterxml.jackson.databind.deser.ValueInstantiator;
import com.fasterxml.jackson.databind.deser.std.ReferenceTypeDeserializer;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.databind.type.ReferenceType;

import java.io.IOException;

public class JsonNullableDeserializer extends ReferenceTypeDeserializer<JsonNullable<Object>> {

private static final long serialVersionUID = 1L;

private boolean isStringDeserializer = false;

/*
/**********************************************************
/* Life-cycle
/**********************************************************
*/
public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
TypeDeserializer typeDeser, JsonDeserializer<?> deser)
{
TypeDeserializer typeDeser, JsonDeserializer<?> deser) {
super(fullType, inst, typeDeser, deser);
if (fullType instanceof ReferenceType && ((ReferenceType) fullType).getReferencedType() != null) {
this.isStringDeserializer = ((ReferenceType) fullType).getReferencedType().isTypeOrSubTypeOf(String.class);
}
}

/*
Expand All @@ -37,7 +42,7 @@ public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
@Override
public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonToken t = p.getCurrentToken();
if (t == JsonToken.VALUE_STRING && !_fullType.isTypeOrSubTypeOf(String.class)) {
if (t == JsonToken.VALUE_STRING && !isStringDeserializer) {
String str = p.getText().trim();
if (str.isEmpty()) {
return JsonNullable.undefined();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;

public final class JsonNullableSimpleTest {

Expand Down Expand Up @@ -69,22 +69,44 @@ public void serializeCollection() throws JsonProcessingException {
}

@Test
public void deserialize() throws IOException {
public void deserializeStringMembers() throws IOException {
testReadPetName(JsonNullable.of("Rex"), "{\"name\":\"Rex\"}");
testReadPetName(JsonNullable.<String>of(null), "{\"name\":null}");
testReadPetName(JsonNullable.<String>of(""), "{\"name\":\"\"}");
testReadPetName(JsonNullable.<String>of(" "), "{\"name\":\" \"}");
testReadPetName(JsonNullable.<String>undefined(), "{}");
}

@Test
public void deserializeNonBeanProperty() throws IOException {
public void deserializeNonStringMembers() throws IOException {
testReadPetAge(JsonNullable.of(Integer.valueOf(15)), "{\"age\":\"15\"}");
testReadPetAge(JsonNullable.<Integer>of(null), "{\"age\":null}");
testReadPetAge(JsonNullable.<Integer>undefined(), "{\"age\":\"\"}");
testReadPetAge(JsonNullable.<Integer>undefined(), "{\"age\":\" \"}");
testReadPetAge(JsonNullable.<Integer>undefined(), "{}");
}

@Test
public void deserializeStringNonBeanMembers() throws IOException {
assertEquals(JsonNullable.of(null), mapper.readValue("null", new TypeReference<JsonNullable<String>>() {}));
assertEquals(JsonNullable.of("42"), mapper.readValue("\"42\"", new TypeReference<JsonNullable<String>>() {}));
assertEquals(JsonNullable.of(""), mapper.readValue("\"\"", new TypeReference<JsonNullable<String>>() {}));
assertEquals(JsonNullable.of(" "), mapper.readValue("\" \"", new TypeReference<JsonNullable<String>>() {}));
}

@Test
public void deserializeNonStringNonBeanMembers() throws IOException {
assertEquals(JsonNullable.of(null), mapper.readValue("\"null\"", new TypeReference<JsonNullable<Integer>>() {}));
assertEquals(JsonNullable.of(42), mapper.readValue("\"42\"", new TypeReference<JsonNullable<Integer>>() {}));
assertEquals(JsonNullable.undefined(), mapper.readValue("\"\"", new TypeReference<JsonNullable<Integer>>() {}));
assertEquals(JsonNullable.undefined(), mapper.readValue("\" \"", new TypeReference<JsonNullable<Integer>>() {}));
}

@Test
public void deserializeCollection() throws IOException {
List<JsonNullable<String>> values = mapper.readValue("[\"foo\", null]", new TypeReference<List<JsonNullable<String>>>() {});
List<JsonNullable<String>> values = mapper.readValue("[\"foo\", null]",
new TypeReference<List<JsonNullable<String>>>() {
});
assertEquals(2, values.size());
assertEquals(JsonNullable.of("foo"), values.get(0));
assertEquals(JsonNullable.of(null), values.get(1));
Expand All @@ -96,13 +118,25 @@ private void testReadPetName(JsonNullable<String> expected, String json) throws
assertEquals(expected, name);
}

private void testReadPetAge(JsonNullable<Integer> expected, String json) throws IOException {
Pet pet = mapper.readValue(json, Pet.class);
JsonNullable<Integer> age = pet.age;
assertEquals(expected, age);
}

private static class Pet {

public JsonNullable<String> name = JsonNullable.undefined();
public JsonNullable<Integer> age = JsonNullable.undefined();

public Pet name(JsonNullable<String> name) {
this.name = name;
return this;
}

public Pet age(JsonNullable<Integer> age) {
this.age = age;
return this;
}
}
}