diff options
| author | Bond-009 <bond.009@outlook.com> | 2020-10-02 19:57:47 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-02 19:57:47 +0200 |
| commit | c3655e0e2ef5d29eed07c228be17be942dff7c7f (patch) | |
| tree | 169b699b2ae0d3bdbd4fc01b0fd8065a08c281f5 /MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs | |
| parent | c7b3d4a90c946f9a2438622cc0ca43d19b84bef8 (diff) | |
| parent | ac790cd77b81a8235f6d1faf9512c85c96fcd088 (diff) | |
Merge pull request #4217 from crobibero/json-nullable-struct-converter
Properly handle null structs in json
Diffstat (limited to 'MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs')
| -rw-r--r-- | MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs b/MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs index cffc41ba3..0501f7b2a 100644 --- a/MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs +++ b/MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs @@ -8,37 +8,38 @@ namespace MediaBrowser.Common.Json.Converters /// Converts a nullable struct or value to/from JSON. /// Required - some clients send an empty string. /// </summary> - /// <typeparam name="T">The struct type.</typeparam> - public class JsonNullableStructConverter<T> : JsonConverter<T?> - where T : struct + /// <typeparam name="TStruct">The struct type.</typeparam> + public class JsonNullableStructConverter<TStruct> : JsonConverter<TStruct?> + where TStruct : struct { - private readonly JsonConverter<T?> _baseJsonConverter; - - /// <summary> - /// Initializes a new instance of the <see cref="JsonNullableStructConverter{T}"/> class. - /// </summary> - /// <param name="baseJsonConverter">The base json converter.</param> - public JsonNullableStructConverter(JsonConverter<T?> baseJsonConverter) - { - _baseJsonConverter = baseJsonConverter; - } - /// <inheritdoc /> - public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override TStruct? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - // Handle empty string. + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + + // Token is empty string. if (reader.TokenType == JsonTokenType.String && ((reader.HasValueSequence && reader.ValueSequence.IsEmpty) || reader.ValueSpan.IsEmpty)) { return null; } - return _baseJsonConverter.Read(ref reader, typeToConvert, options); + return JsonSerializer.Deserialize<TStruct>(ref reader, options); } /// <inheritdoc /> - public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, TStruct? value, JsonSerializerOptions options) { - _baseJsonConverter.Write(writer, value, options); + if (value.HasValue) + { + JsonSerializer.Serialize(writer, value.Value, options); + } + else + { + writer.WriteNullValue(); + } } } } |
