From 94d14f83c5e760fe947d81ee3b0cdceaf890de25 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 12 May 2021 01:04:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E6=96=B0=E5=A2=9E=E8=8B=A5?= =?UTF-8?q?=E5=B9=B2=20bool=20=E9=9D=9E=E6=A0=87=E5=87=86=E5=8C=96=20JsonC?= =?UTF-8?q?onvert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NumberTypedBooleanConverter.cs | 33 +++++++++++ .../NumberTypedNullableBooleanConverter.cs | 57 +++++++++++++++++++ .../NumberTypedBooleanConverter.cs | 23 ++++++++ .../NumberTypedNullableBooleanConverter.cs | 51 +++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedNullableBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedNullableBooleanConverter.cs diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedBooleanConverter.cs new file mode 100644 index 00000000..4b269e90 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedBooleanConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class NumberTypedBooleanConverter : JsonConverter + { + private readonly JsonConverter _converter = new NumberTypedNullableBooleanConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override bool ReadJson(JsonReader reader, Type objectType, bool existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer) ?? default; + } + + public override void WriteJson(JsonWriter writer, bool value, JsonSerializer serializer) + { + _converter.WriteJson(writer, value, serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedNullableBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedNullableBooleanConverter.cs new file mode 100644 index 00000000..c7d1cc24 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/NumberTypedNullableBooleanConverter.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class NumberTypedNullableBooleanConverter : JsonConverter + { + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override bool? ReadJson(JsonReader reader, Type objectType, bool? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return existingValue; + } + else if (reader.TokenType == JsonToken.Boolean) + { + return serializer.Deserialize(reader); + } + else if (reader.TokenType == JsonToken.Integer) + { + int value = serializer.Deserialize(reader); + return Convert.ToBoolean(value); + } + else if (reader.TokenType == JsonToken.String) + { + string? str = serializer.Deserialize(reader); + if (str == null) + return existingValue; + + if (int.TryParse(str, out int value)) + return Convert.ToBoolean(value); + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, bool? value, JsonSerializer serializer) + { + if (value.HasValue) + writer.WriteValue(value.Value ? 1 : 0); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedBooleanConverter.cs new file mode 100644 index 00000000..0ac0a920 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedBooleanConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class NumberTypedBooleanConverter : JsonConverter + { + private readonly JsonConverter _converter = new NumberTypedNullableBooleanConverter(); + + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options) ?? default; + } + + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + _converter.Write(writer, value, options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedNullableBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedNullableBooleanConverter.cs new file mode 100644 index 00000000..9f9fa11e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/NumberTypedNullableBooleanConverter.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class NumberTypedNullableBooleanConverter : JsonConverter + { + public override bool? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.True) + { + return true; + } + else if (reader.TokenType == JsonTokenType.False) + { + return false; + } + else if (reader.TokenType == JsonTokenType.Number) + { + if (reader.TryGetInt32(out int value)) + return Convert.ToBoolean(value); + } + else if (reader.TokenType == JsonTokenType.String) + { + string? str = reader.GetString(); + if (str == null) + return null; + + if (int.TryParse(str, out int value)) + return Convert.ToBoolean(value); + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, bool? value, JsonSerializerOptions options) + { + if (value.HasValue) + writer.WriteNumberValue(value.Value ? 1 : 0); + else + writer.WriteNullValue(); + } + } +}