@@ -49,7 +49,12 @@ namespace <#= this.Config.Namespace #>.Model.Internal.MarshallTransformat
49
49
<#=new string(' ', level * 4)#> {
50
50
<#=new string(' ', level * 4)#> context.Writer.WritePropertyName("<#=member.MarshallName#>");
51
51
<#+
52
- string memberProperty = variableName + "." + member.PropertyName + (member.IsNullable ? ".Value" : string.Empty);
52
+ string memberProperty = variableName + "." + member.PropertyName;
53
+ // Only append .Value for nullable types that aren't already complex types
54
+ if (member.IsNullable && !member.IsStructure && !member.IsList && !member.IsMap)
55
+ {
56
+ memberProperty += ".Value";
57
+ }
53
58
if(member.IsStructure || member.IsList || member.IsMap)
54
59
{
55
60
this.ProcessStructure(level + 1, variableName + "." + member.PropertyName, member.Shape);
@@ -153,19 +158,7 @@ namespace <#= this.Config.Namespace #>.Model.Internal.MarshallTransformat
153
158
}
154
159
else if(structure.IsMap)
155
160
{
156
- #>
157
- <#=new string(' ', level * 4)#> context.Writer.WriteStartObject();
158
- <#=new string(' ', level * 4)#> foreach (var <#=flatVariableName#>Kvp in <#=variableName#>)
159
- <#=new string(' ', level * 4)#> {
160
- <#=new string(' ', level * 4)#> context.Writer.WritePropertyName(<#=flatVariableName#>Kvp.Key);
161
- <#=new string(' ', level * 4)#> var <#=flatVariableName#>Value = <#=flatVariableName#>Kvp.Value;
162
-
163
- <#+
164
- ProcessStructure(level + 1, flatVariableName + "Value", structure.ValueShape);
165
- #>
166
- <#=new string(' ', level * 4)#> }
167
- <#=new string(' ', level * 4)#> context.Writer.WriteEndObject();
168
- <#+
161
+ ProcessMap(level, variableName, structure);
169
162
}
170
163
else if(structure.IsDocument)
171
164
{
@@ -207,8 +200,126 @@ namespace <#= this.Config.Namespace #>.Model.Internal.MarshallTransformat
207
200
208
201
}
209
202
}
203
+
204
+ protected void ProcessMap(int level, string variableName, Shape structure)
205
+ {
206
+ string flatVariableName = variableName.Replace(".", "");
207
+ #>
208
+ <#=new string(' ', level * 4)#> context.Writer.WriteStartObject();
209
+ <#=new string(' ', level * 4)#> foreach (var <#=flatVariableName#>Kvp in <#=variableName#>)
210
+ <#=new string(' ', level * 4)#> {
211
+ <#=new string(' ', level * 4)#> context.Writer.WritePropertyName(<#=flatVariableName#>Kvp.Key);
212
+ <#=new string(' ', level * 4)#> var <#=flatVariableName#>Value = <#=flatVariableName#>Kvp.Value;
213
+
214
+ <#+ // Check for null values - only null checks for sparse maps as defined in customizations
215
+
216
+ bool isNullableMap = false;
217
+ if (this.Structure != null)
218
+ {
219
+ var memberWithMap = this.Structure.Members.FirstOrDefault(m => m.PropertyName == variableName.Split('.').Last());
220
+ isNullableMap = (memberWithMap != null && memberWithMap.UseNullable);
221
+ }
222
+
223
+ if (isNullableMap)
224
+ {
225
+ #>
226
+ <#=new string(' ', level * 4)#> if (<#=flatVariableName#>Value == null)
227
+ <#=new string(' ', level * 4)#> {
228
+ <#=new string(' ', level * 4)#> context.Writer.WriteNullValue();
229
+ <#=new string(' ', level * 4)#> }
230
+ <#=new string(' ', level * 4)#> else
231
+ <#=new string(' ', level * 4)#> {
232
+ <#+
233
+ }
234
+
235
+ if(structure.ValueShape.IsBoolean)
236
+ {
237
+ if(isNullableMap)
238
+ {
210
239
#>
240
+ <#=new string(' ', level * 4)#> context.Writer.WriteBooleanValue(<#=flatVariableName#>Value.Value);
211
241
<#+
242
+ }
243
+ else
244
+ {
245
+ #>
246
+ <#=new string(' ', level * 4)#> context.Writer.WriteBooleanValue(<#=flatVariableName#>Value);
247
+ <#+
248
+ }
249
+ }
250
+ else if(structure.ValueShape.IsInt || structure.ValueShape.IsLong || structure.ValueShape.IsFloat || structure.ValueShape.IsDouble)
251
+ {
252
+ if(isNullableMap)
253
+ {
254
+ #>
255
+ <#=new string(' ', level * 4)#> context.Writer.WriteNumberValue(<#=flatVariableName#>Value.Value);
256
+ <#+
257
+ }
258
+ else
259
+ {
260
+ #>
261
+ <#=new string(' ', level * 4)#> context.Writer.WriteNumberValue(<#=flatVariableName#>Value);
262
+ <#+
263
+ }
264
+ }
265
+ else if(structure.ValueShape.IsTimeStamp)
266
+ {
267
+ if(isNullableMap)
268
+ {
269
+ if (structure.ValueShape.data[Shape.TimestampFormatKey] != null && !string.Equals(structure.ValueShape.data["timestampFormat"].ToString(), "unixTimestamp"))
270
+ {
271
+ #>
272
+ <#=new string(' ', level * 4)#> context.Writer.WriteStringValue(<#=flatVariableName#>Value.Value);
273
+ <#+
274
+ }
275
+ else
276
+ {
277
+ #>
278
+ <#=new string(' ', level * 4)#> context.Writer.WriteNumberValue(Convert.ToInt64(StringUtils.FromDateTimeToUnixTimestamp(<#=flatVariableName#>Value.Value)));
279
+ <#+
280
+ }
281
+ }
282
+ else
283
+ {
284
+ if (structure.ValueShape.data[Shape.TimestampFormatKey] != null && !string.Equals(structure.ValueShape.data["timestampFormat"].ToString(), "unixTimestamp"))
285
+ {
286
+ #>
287
+ <#=new string(' ', level * 4)#> context.Writer.WriteStringValue(<#=flatVariableName#>Value);
288
+ <#+
289
+ }
290
+ else
291
+ {
292
+ #>
293
+ <#=new string(' ', level * 4)#> context.Writer.WriteNumberValue(Convert.ToInt64(StringUtils.FromDateTimeToUnixTimestamp(<#=flatVariableName#>Value)));
294
+ <#+
295
+ }
296
+ }
297
+ }
298
+ else
299
+ {
300
+ if(isNullableMap)
301
+ {
302
+ ProcessStructure(level + 2, flatVariableName + "Value", structure.ValueShape);
303
+ }
304
+ else
305
+ {
306
+ ProcessStructure(level + 1, flatVariableName + "Value", structure.ValueShape);
307
+ }
308
+ }
309
+
310
+ // Close the else block for nullable maps
311
+ if (isNullableMap)
312
+ {
313
+ #>
314
+ <#=new string(' ', level * 4)#> }
315
+ <#+
316
+ }
317
+ #>
318
+ <#=new string(' ', level * 4)#> }
319
+ <#=new string(' ', level * 4)#> context.Writer.WriteEndObject();
320
+ <#+
321
+ }
322
+
212
323
protected void DetermineCustomMarshallerJsonWriteMethod(Member member, string memberProperty, int level)
213
324
{
214
325
if (String.Equals(member.CustomMarshallerTransformation,"Amazon.Util.AWSSDKUtils.ConvertToUnixEpochMilliseconds", StringComparison.OrdinalIgnoreCase))
@@ -224,8 +335,7 @@ namespace <#= this.Config.Namespace #>.Model.Internal.MarshallTransformat
224
335
<#+
225
336
}
226
337
}
227
- #>
228
- <#+
338
+
229
339
/// https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html#json-shape-serialization
230
340
/// timestamps in json protocols use unixtimestamp if none is specified (by default)
231
341
protected void DetermineNormalJsonWriteMethod(Shape shape, string memberProperty, int level)
@@ -256,6 +366,7 @@ namespace <#= this.Config.Namespace #>.Model.Internal.MarshallTransformat
256
366
}
257
367
else if (shape.IsInt || shape.IsLong || shape.IsFloat || shape.IsDouble)
258
368
{
369
+ // Simple numeric value
259
370
#>
260
371
<#=new string(' ', level * 4)#> context.Writer.WriteNumberValue(<#=memberProperty#>);
261
372
<#+
0 commit comments