diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java index 2df46ef0f47..b511122fced 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java @@ -2466,7 +2466,7 @@ private HttpBinding readPayload( // If payload is a Union, then we need to parse the string into JavaScript object. importUnionDeserializer(writer); writer.write("const data: Record | undefined " - + "= __expectUnion(await parseBody(output.body, context));"); + + "= await parseBody(output.body, context);"); } else if (target instanceof StringShape || target instanceof DocumentShape) { // If payload is String or Document, we need to collect body and convert binary to string. writer.write("const data: any = await collectBodyString(output.body, context);"); @@ -2474,8 +2474,21 @@ private HttpBinding readPayload( throw new CodegenException(String.format("Unexpected shape type bound to payload: `%s`", target.getType())); } - writer.write("contents.$L = $L;", binding.getMemberName(), getOutputValue(context, + + if (target instanceof UnionShape) { + writer.openBlock( + "if (Object.keys(data ?? {}).length) {", + "}", + () -> { + writer.write("contents.$L = __expectUnion($L);", binding.getMemberName(), getOutputValue(context, + Location.PAYLOAD, "data", binding.getMember(), target)); + } + ); + } else { + writer.write("contents.$L = $L;", binding.getMemberName(), getOutputValue(context, Location.PAYLOAD, "data", binding.getMember(), target)); + } + return binding; }