Skip to content

Commit

Permalink
Allow writing and reading null values (#78)
Browse files Browse the repository at this point in the history
This closes #23, #50 and #67
  • Loading branch information
ansman authored and rharter committed Oct 25, 2016
1 parent 9d6e6d2 commit 1c0995d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Property, FieldSpec> 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);

This comment has been minimized.

Copy link
@naturalwarren

naturalwarren Feb 7, 2017

This seems dangerous - what if you're passing a null off to an adapter that can't handle it?

}
writeMethod.addStatement("$N.endObject()", jsonWriter);

Expand All @@ -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
Expand All @@ -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<Property, FieldSpec> entry : fields.entrySet()) {
Property prop = entry.getKey();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -177,10 +181,6 @@ public void simple() {
+ " List<String> 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"
Expand Down Expand Up @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -525,21 +529,25 @@ 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"
+ " 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"
+ " 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"
Expand Down Expand Up @@ -618,6 +626,10 @@ public void simple() {
+ " }\n"
+ " @Override\n"
+ " public void write(JsonWriter jsonWriter, Foo<A, B, C> 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"
Expand All @@ -631,17 +643,17 @@ public void simple() {
+ " }\n"
+ " @Override\n"
+ " public Foo<A, B, C> 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"
+ " B b = null;\n"
+ " 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"
Expand Down

0 comments on commit 1c0995d

Please sign in to comment.