Skip to content

Commit 1e3be8b

Browse files
Fix serialization handling of optional fields
Do not require them when deserializing, and don't write them out when serializing if they are null.
1 parent 033a22b commit 1e3be8b

5 files changed

Lines changed: 64 additions & 25 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ dockerfile
1818
docker-compose.*
1919

2020
node_modules
21-
out
21+
out
22+
.claude

ShipEngineSDK/Model/CalculateRatesRequestBody.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,21 @@ public override void Write(Utf8JsonWriter writer, CalculateRatesRequestBody valu
201201
{
202202
writer.WriteStartObject();
203203

204-
writer.WritePropertyName("rate_options");
205-
JsonSerializer.Serialize(writer, value.RateOptions, options);
206-
writer.WritePropertyName("ship_from_service_point_id");
207-
JsonSerializer.Serialize(writer, value.ShipFromServicePointId, options);
208-
writer.WritePropertyName("ship_to_service_point_id");
209-
JsonSerializer.Serialize(writer, value.ShipToServicePointId, options);
204+
if (value.RateOptions != null)
205+
{
206+
writer.WritePropertyName("rate_options");
207+
JsonSerializer.Serialize(writer, value.RateOptions, options);
208+
}
209+
if (value.ShipFromServicePointId != null)
210+
{
211+
writer.WritePropertyName("ship_from_service_point_id");
212+
JsonSerializer.Serialize(writer, value.ShipFromServicePointId, options);
213+
}
214+
if (value.ShipToServicePointId != null)
215+
{
216+
writer.WritePropertyName("ship_to_service_point_id");
217+
JsonSerializer.Serialize(writer, value.ShipToServicePointId, options);
218+
}
210219

211220
var node = JsonSerializer.SerializeToNode(value.ActualInstance, options);
212221
foreach (var prop in node?.AsObject() ?? [])
@@ -239,9 +248,9 @@ public override void Write(Utf8JsonWriter writer, CalculateRatesRequestBody valu
239248
CalculateRatesRequestBody? newCalculateRatesRequestBody = null;
240249

241250
// Deserialize all the common properties of the model so they can be used in object initializers later
242-
var rateOptions = jsonDoc.RootElement.GetProperty("rate_options").Deserialize<RateRequestBody>(DeserializingOptions)!;
243-
var shipFromServicePointId = jsonDoc.RootElement.GetProperty("ship_from_service_point_id").Deserialize<string>(DeserializingOptions)!;
244-
var shipToServicePointId = jsonDoc.RootElement.GetProperty("ship_to_service_point_id").Deserialize<string>(DeserializingOptions)!;
251+
var rateOptions = jsonDoc.RootElement.TryGetProperty("rate_options", out var rateOptionsElement) ? rateOptionsElement.Deserialize<RateRequestBody>(DeserializingOptions) : null;
252+
var shipFromServicePointId = jsonDoc.RootElement.TryGetProperty("ship_from_service_point_id", out var shipFromServicePointIdElement) ? shipFromServicePointIdElement.Deserialize<string>(DeserializingOptions) : null;
253+
var shipToServicePointId = jsonDoc.RootElement.TryGetProperty("ship_to_service_point_id", out var shipToServicePointIdElement) ? shipToServicePointIdElement.Deserialize<string>(DeserializingOptions) : null;
245254

246255
int match = 0;
247256
var matchedTypes = new List<string>();

ShipEngineSDK/Model/CompareBulkRatesRequestBody.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,16 @@ public override void Write(Utf8JsonWriter writer, CompareBulkRatesRequestBody va
203203

204204
writer.WritePropertyName("rate_options");
205205
JsonSerializer.Serialize(writer, value.RateOptions, options);
206-
writer.WritePropertyName("ship_from_service_point_id");
207-
JsonSerializer.Serialize(writer, value.ShipFromServicePointId, options);
208-
writer.WritePropertyName("ship_to_service_point_id");
209-
JsonSerializer.Serialize(writer, value.ShipToServicePointId, options);
206+
if (value.ShipFromServicePointId != null)
207+
{
208+
writer.WritePropertyName("ship_from_service_point_id");
209+
JsonSerializer.Serialize(writer, value.ShipFromServicePointId, options);
210+
}
211+
if (value.ShipToServicePointId != null)
212+
{
213+
writer.WritePropertyName("ship_to_service_point_id");
214+
JsonSerializer.Serialize(writer, value.ShipToServicePointId, options);
215+
}
210216

211217
var node = JsonSerializer.SerializeToNode(value.ActualInstance, options);
212218
foreach (var prop in node?.AsObject() ?? [])
@@ -240,8 +246,8 @@ public override void Write(Utf8JsonWriter writer, CompareBulkRatesRequestBody va
240246

241247
// Deserialize all the common properties of the model so they can be used in object initializers later
242248
var rateOptions = jsonDoc.RootElement.GetProperty("rate_options").Deserialize<RateRequestBody>(DeserializingOptions)!;
243-
var shipFromServicePointId = jsonDoc.RootElement.GetProperty("ship_from_service_point_id").Deserialize<string>(DeserializingOptions)!;
244-
var shipToServicePointId = jsonDoc.RootElement.GetProperty("ship_to_service_point_id").Deserialize<string>(DeserializingOptions)!;
249+
var shipFromServicePointId = jsonDoc.RootElement.TryGetProperty("ship_from_service_point_id", out var shipFromServicePointIdElement) ? shipFromServicePointIdElement.Deserialize<string>(DeserializingOptions) : null;
250+
var shipToServicePointId = jsonDoc.RootElement.TryGetProperty("ship_to_service_point_id", out var shipToServicePointIdElement) ? shipToServicePointIdElement.Deserialize<string>(DeserializingOptions) : null;
245251

246252
int match = 0;
247253
var matchedTypes = new List<string>();

ShipEngineSDK/Model/EstimateRatesRequestBody.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -316,12 +316,21 @@ public override void Write(Utf8JsonWriter writer, EstimateRatesRequestBody value
316316
JsonSerializer.Serialize(writer, value.ToStateProvince, options);
317317
writer.WritePropertyName("weight");
318318
JsonSerializer.Serialize(writer, value.Weight, options);
319-
writer.WritePropertyName("address_residential_indicator");
320-
JsonSerializer.Serialize(writer, value.AddressResidentialIndicator, options);
321-
writer.WritePropertyName("confirmation");
322-
JsonSerializer.Serialize(writer, value.Confirmation, options);
323-
writer.WritePropertyName("dimensions");
324-
JsonSerializer.Serialize(writer, value.Dimensions, options);
319+
if (value.AddressResidentialIndicator != null)
320+
{
321+
writer.WritePropertyName("address_residential_indicator");
322+
JsonSerializer.Serialize(writer, value.AddressResidentialIndicator, options);
323+
}
324+
if (value.Confirmation != null)
325+
{
326+
writer.WritePropertyName("confirmation");
327+
JsonSerializer.Serialize(writer, value.Confirmation, options);
328+
}
329+
if (value.Dimensions != null)
330+
{
331+
writer.WritePropertyName("dimensions");
332+
JsonSerializer.Serialize(writer, value.Dimensions, options);
333+
}
325334

326335
var node = JsonSerializer.SerializeToNode(value.ActualInstance, options);
327336
foreach (var prop in node?.AsObject() ?? [])
@@ -364,9 +373,9 @@ public override void Write(Utf8JsonWriter writer, EstimateRatesRequestBody value
364373
var toPostalCode = jsonDoc.RootElement.GetProperty("to_postal_code").Deserialize<string>(DeserializingOptions)!;
365374
var toStateProvince = jsonDoc.RootElement.GetProperty("to_state_province").Deserialize<string>(DeserializingOptions)!;
366375
var weight = jsonDoc.RootElement.GetProperty("weight").Deserialize<Weight>(DeserializingOptions)!;
367-
var addressResidentialIndicator = jsonDoc.RootElement.GetProperty("address_residential_indicator").Deserialize<AddressResidentialIndicator>(DeserializingOptions)!;
368-
var confirmation = jsonDoc.RootElement.GetProperty("confirmation").Deserialize<DeliveryConfirmation>(DeserializingOptions)!;
369-
var dimensions = jsonDoc.RootElement.GetProperty("dimensions").Deserialize<Dimensions>(DeserializingOptions)!;
376+
var addressResidentialIndicator = jsonDoc.RootElement.TryGetProperty("address_residential_indicator", out var addressResidentialIndicatorElement) ? addressResidentialIndicatorElement.Deserialize<AddressResidentialIndicator>(DeserializingOptions) : null;
377+
var confirmation = jsonDoc.RootElement.TryGetProperty("confirmation", out var confirmationElement) ? confirmationElement.Deserialize<DeliveryConfirmation>(DeserializingOptions) : null;
378+
var dimensions = jsonDoc.RootElement.TryGetProperty("dimensions", out var dimensionsElement) ? dimensionsElement.Deserialize<Dimensions>(DeserializingOptions) : null;
370379

371380
int match = 0;
372381
var matchedTypes = new List<string>();

generation/templates/modelOneOf.mustache

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,17 @@ public class {{classname}}JsonConverter : JsonConverter<{{classname}}>
294294
295295
{{#composedSchemas.allOf}}
296296
{{#allVars}}
297+
{{#required}}
297298
writer.WritePropertyName("{{baseName}}");
298299
JsonSerializer.Serialize(writer, value.{{name}}, options);
300+
{{/required}}
301+
{{^required}}
302+
if (value.{{name}} != null)
303+
{
304+
writer.WritePropertyName("{{baseName}}");
305+
JsonSerializer.Serialize(writer, value.{{name}}, options);
306+
}
307+
{{/required}}
299308
{{/allVars}}
300309
{{/composedSchemas.allOf}}
301310

@@ -332,7 +341,12 @@ public class {{classname}}JsonConverter : JsonConverter<{{classname}}>
332341
{{#composedSchemas.allOf}}
333342
// Deserialize all the common properties of the model so they can be used in object initializers later
334343
{{#allVars}}
344+
{{#required}}
335345
var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} = jsonDoc.RootElement.GetProperty("{{baseName}}").Deserialize<{{#isEnum}}{{{complexType}}}{{^complexType}}{{{datatypeWithEnum}}}{{/complexType}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}>(DeserializingOptions)!;
346+
{{/required}}
347+
{{^required}}
348+
var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} = jsonDoc.RootElement.TryGetProperty("{{baseName}}", out var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Element) ? {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Element.Deserialize<{{#isEnum}}{{{complexType}}}{{^complexType}}{{{datatypeWithEnum}}}{{/complexType}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}>(DeserializingOptions) : null;
349+
{{/required}}
336350
{{/allVars}}
337351
{{/composedSchemas.allOf}}
338352

0 commit comments

Comments
 (0)