From 1c0995d5b24124712fe0aa1bde4328d689df0a99 Mon Sep 17 00:00:00 2001 From: Nicklas Ansman Giertz Date: Tue, 25 Oct 2016 17:08:25 +0200 Subject: [PATCH] Allow writing and reading null values (#78) This closes #23, #50 and #67 --- .../value/gson/AutoValueGsonExtension.java | 27 ++++----- .../gson/AutoValueGsonExtensionTest.java | 60 +++++++++++-------- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/auto-value-gson/src/main/java/com/ryanharter/auto/value/gson/AutoValueGsonExtension.java b/auto-value-gson/src/main/java/com/ryanharter/auto/value/gson/AutoValueGsonExtension.java index afb0806c..e98ffd9a 100755 --- a/auto-value-gson/src/main/java/com/ryanharter/auto/value/gson/AutoValueGsonExtension.java +++ b/auto-value-gson/src/main/java/com/ryanharter/auto/value/gson/AutoValueGsonExtension.java @@ -336,20 +336,18 @@ public MethodSpec createWriteMethod(TypeName autoValueClassName, .addParameter(annotatedParam) .addException(IOException.class); + writeMethod.beginControlFlow("if ($N == null)", annotatedParam); + writeMethod.addStatement("$N.nullValue()", jsonWriter); + writeMethod.addStatement("return"); + writeMethod.endControlFlow(); + writeMethod.addStatement("$N.beginObject()", jsonWriter); for (Map.Entry entry : adapters.entrySet()) { Property prop = entry.getKey(); FieldSpec field = entry.getValue(); - if (prop.nullable()) { - writeMethod.beginControlFlow("if ($N.$N() != null)", annotatedParam, prop.methodName); - writeMethod.addStatement("$N.name($S)", jsonWriter, prop.serializedName()); - writeMethod.addStatement("$N.write($N, $N.$N())", field, jsonWriter, annotatedParam, prop.methodName); - writeMethod.endControlFlow(); - } else { - writeMethod.addStatement("$N.name($S)", jsonWriter, prop.serializedName()); - writeMethod.addStatement("$N.write($N, $N.$N())", field, jsonWriter, annotatedParam, prop.methodName); - } + writeMethod.addStatement("$N.name($S)", jsonWriter, prop.serializedName()); + writeMethod.addStatement("$N.write($N, $N.$N())", field, jsonWriter, annotatedParam, prop.methodName); } writeMethod.addStatement("$N.endObject()", jsonWriter); @@ -369,6 +367,11 @@ public MethodSpec createReadMethod(ClassName className, ClassName token = ClassName.get(JsonToken.NULL.getDeclaringClass()); + readMethod.beginControlFlow("if ($N.peek() == $T.NULL)", jsonReader, token); + readMethod.addStatement("$N.nextNull()", jsonReader); + readMethod.addStatement("return null"); + readMethod.endControlFlow(); + readMethod.addStatement("$N.beginObject()", jsonReader); // add the properties @@ -392,12 +395,6 @@ public MethodSpec createReadMethod(ClassName className, FieldSpec name = FieldSpec.builder(String.class, "_name").build(); readMethod.addStatement("$T $N = $N.nextName()", name.type, name, jsonReader); - // check if JSON field value is NULL - readMethod.beginControlFlow("if ($N.peek() == $T.NULL)", jsonReader, token); - readMethod.addStatement("$N.skipValue()", jsonReader); - readMethod.addStatement("continue"); - readMethod.endControlFlow(); - readMethod.beginControlFlow("switch ($N)", name); for (Map.Entry entry : fields.entrySet()) { Property prop = entry.getKey(); diff --git a/auto-value-gson/src/test/java/com/ryanharter/auto/value/gson/AutoValueGsonExtensionTest.java b/auto-value-gson/src/test/java/com/ryanharter/auto/value/gson/AutoValueGsonExtensionTest.java index b8545ed8..ad15dd69 100755 --- a/auto-value-gson/src/test/java/com/ryanharter/auto/value/gson/AutoValueGsonExtensionTest.java +++ b/auto-value-gson/src/test/java/com/ryanharter/auto/value/gson/AutoValueGsonExtensionTest.java @@ -135,6 +135,10 @@ public void simple() { + " }\n" + " @Override\n" + " public void write(JsonWriter jsonWriter, Test object) throws IOException {\n" + + " if (object == null) {\n" + + " jsonWriter.nullValue();\n" + + " return;\n" + + " }\n" + " jsonWriter.beginObject();\n" + " jsonWriter.name(\"a\");\n" + " aAdapter.write(jsonWriter, object.a());\n" @@ -144,10 +148,8 @@ public void simple() { + " cAdapter.write(jsonWriter, object.c());\n" + " jsonWriter.name(\"_D\");\n" + " dAdapter.write(jsonWriter, object.d());\n" - + " if (object.e() != null) {\n" - + " jsonWriter.name(\"e\");\n" - + " eAdapter.write(jsonWriter, object.e());\n" - + " }\n" + + " jsonWriter.name(\"e\");\n" + + " eAdapter.write(jsonWriter, object.e());\n" + " jsonWriter.name(\"f\");\n" + " fAdapter.write(jsonWriter, object.f());\n" + " jsonWriter.name(\"g\");\n" @@ -156,14 +158,16 @@ public void simple() { + " hAdapter.write(jsonWriter, object.h());\n" + " jsonWriter.name(\"_I\");\n" + " iAdapter.write(jsonWriter, object.i());\n" - + " if (object.j() != null) {\n" - + " jsonWriter.name(\"j\");\n" - + " jAdapter.write(jsonWriter, object.j());\n" - + " }\n" + + " jsonWriter.name(\"j\");\n" + + " jAdapter.write(jsonWriter, object.j());\n" + " jsonWriter.endObject();\n" + " }\n" + " @Override\n" + " public Test read(JsonReader jsonReader) throws IOException {\n" + + " if (jsonReader.peek() == JsonToken.NULL) {\n" + + " jsonReader.nextNull();\n" + + " return null;\n" + + " }\n" + " jsonReader.beginObject();\n" + " String a = null;\n" + " int[] b = null;\n" @@ -177,10 +181,6 @@ public void simple() { + " List j = null;\n" + " while (jsonReader.hasNext()) {\n" + " String _name = jsonReader.nextName();\n" - + " if (jsonReader.peek() == JsonToken.NULL) {\n" - + " jsonReader.skipValue();\n" - + " continue;\n" - + " }\n" + " switch (_name) {\n" + " case \"a\": {\n" + " a = aAdapter.read(jsonReader);\n" @@ -285,6 +285,10 @@ public void simple() { + " }\n" + " @Override\n" + " public void write(JsonWriter jsonWriter, Test object) throws IOException {\n" + + " if (object == null) {\n" + + " jsonWriter.nullValue();\n" + + " return;\n" + + " }\n" + " jsonWriter.beginObject();\n" + " jsonWriter.name(\"name\");\n" + " nameAdapter.write(jsonWriter, object.getName());\n" @@ -294,15 +298,15 @@ public void simple() { + " }\n" + " @Override\n" + " public Test read(JsonReader jsonReader) throws IOException {\n" + + " if (jsonReader.peek() == JsonToken.NULL) {\n" + + " jsonReader.nextNull();\n" + + " return null;\n" + + " }\n" + " jsonReader.beginObject();\n" + " String name = null;\n" + " boolean awesome = false;\n" + " while (jsonReader.hasNext()) {\n" + " String _name = jsonReader.nextName();\n" - + " if (jsonReader.peek() == JsonToken.NULL) {\n" - + " jsonReader.skipValue();\n" - + " continue;\n" - + " }\n" + " switch (_name) {\n" + " case \"name\": {\n" + " name = nameAdapter.read(jsonReader);\n" @@ -525,6 +529,10 @@ public void simple() { + " }\n" + " @Override\n" + " public void write(JsonWriter jsonWriter, Test object) throws IOException {\n" + + " if (object == null) {\n" + + " jsonWriter.nullValue();\n" + + " return;\n" + + " }\n" + " jsonWriter.beginObject();\n" + " jsonWriter.name(\"c\");\n" + " cAdapter.write(jsonWriter, object.c());\n" @@ -532,14 +540,14 @@ public void simple() { + " }\n" + " @Override\n" + " public Test read(JsonReader jsonReader) throws IOException {\n" + + " if (jsonReader.peek() == JsonToken.NULL) {\n" + + " jsonReader.nextNull();\n" + + " return null;\n" + + " }\n" + " jsonReader.beginObject();\n" + " char c = '\0';\n" + " while (jsonReader.hasNext()) {\n" + " String _name = jsonReader.nextName();\n" - + " if (jsonReader.peek() == JsonToken.NULL) {\n" - + " jsonReader.skipValue();\n" - + " continue;\n" - + " }\n" + " switch (_name) {\n" + " case \"c\": {\n" + " c = cAdapter.read(jsonReader);\n" @@ -618,6 +626,10 @@ public void simple() { + " }\n" + " @Override\n" + " public void write(JsonWriter jsonWriter, Foo object) throws IOException {\n" + + " if (object == null) {\n" + + " jsonWriter.nullValue();\n" + + " return;\n" + + " }\n" + " jsonWriter.beginObject();\n" + " jsonWriter.name(\"c\");\n" + " cAdapter.write(jsonWriter, object.c());\n" @@ -631,6 +643,10 @@ public void simple() { + " }\n" + " @Override\n" + " public Foo read(JsonReader jsonReader) throws IOException {\n" + + " if (jsonReader.peek() == JsonToken.NULL) {\n" + + " jsonReader.nextNull();\n" + + " return null;\n" + + " }\n" + " jsonReader.beginObject();\n" + " C c = null;\n" + " A a = null;\n" @@ -638,10 +654,6 @@ public void simple() { + " String d = null;\n" + " while (jsonReader.hasNext()) {\n" + " String _name = jsonReader.nextName();\n" - + " if (jsonReader.peek() == JsonToken.NULL) {\n" - + " jsonReader.skipValue();\n" - + " continue;\n" - + " }\n" + " switch (_name) {\n" + " case \"c\": {\n" + " c = cAdapter.read(jsonReader);\n"