diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java index f876f038..cd1818ce 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java @@ -480,7 +480,9 @@ private void writeFromJsonImplementation(Append writer, String varName) { writer.append(" // unmappedField... ", varName).eol(); unmappedField.writeFromJsonUnmapped(writer, varName); } - writer.append(" return _$%s;", varName).eol(); + if (directLoad) { + writer.append(" return _$%s;", varName).eol(); + } writer.append(" }").eol(); } @@ -489,11 +491,28 @@ private boolean unmappedJsonNodeType() { } private void writeJsonBuildResult(Append writer, String varName) { - writer.append(" // build and return %s", shortName).eol(); + var buildFields = allFields.stream() + .filter(FieldReader::includeFromJsonBuild) + .collect(toList()); + + boolean directReturn = buildFields.isEmpty(); + if (!directReturn) { + writer.append(" // build and return %s", shortName).eol(); + } else { + writer.append(" // direct return").eol(); + writer.append(" return "); + } if (constructor == null) { - writer.append(" %s _$%s = new %s(", shortName, varName, shortName); + if (directReturn) { + writer.append("new %s(", shortName); + } else { + writer.append(" %s _$%s = new %s(", shortName, varName, shortName); + } } else { - writer.append(" %s _$%s = " + constructor.creationString(), shortName, varName); + if (!directReturn) { + writer.append(" %s _$%s = ", shortName, varName); + } + writer.append(constructor.creationString()); final List params = constructor.getParams(); for (int i = 0, size = params.size(); i < size; i++) { if (i > 0) { @@ -516,11 +535,12 @@ private void writeJsonBuildResult(Append writer, String varName) { } } writer.append(");").eol(); - for (final FieldReader allField : allFields) { - if (allField.includeFromJson()) { - frequencyMap.compute(allField.fieldName(), (k, v) -> v == null ? 0 : v + 1); - allField.writeFromJsonSetter(writer, varName, ""); - } + for (final FieldReader allField : buildFields) { + frequencyMap.compute(allField.fieldName(), (k, v) -> v == null ? 0 : v + 1); + allField.writeFromJsonSetter(writer, varName, ""); + } + if (!directReturn) { + writer.append(" return _$%s;", varName).eol(); } } diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java index 62260838..e50b2a37 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java @@ -130,6 +130,10 @@ boolean includeFromJson() { return deserialize; } + boolean includeFromJsonBuild() { + return deserialize && !isCreatorParam && !property.isConstructorParam(); + } + boolean includeToJson() { return serialize; }