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(); + } + } +}