diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32ArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32ArrayConverter.cs new file mode 100644 index 00000000..25833f14 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32ArrayConverter.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class SeparatedByVBarInt32ArrayConverter : JsonConverter + { + private const string SEPARATOR = "|"; + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override int[]? ReadJson(JsonReader reader, Type objectType, int[]? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + try + { + return value + .Split(new string[] { SEPARATOR }, StringSplitOptions.RemoveEmptyEntries) + .Select(e => int.Parse(e)) + .ToArray(); + } + catch (FormatException ex) + { + throw new JsonReaderException(ex.Message, ex); + } + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, int[]? value, JsonSerializer serializer) + { + if (value != null) + writer.WriteValue(string.Join(SEPARATOR, value)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32IListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32IListConverter.cs new file mode 100644 index 00000000..7b2da5d7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32IListConverter.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class SeparatedByVBarInt32IListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new SeparatedByVBarInt32ListConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override IList? ReadJson(JsonReader reader, Type objectType, IList? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, ConvertIListToList(existingValue), hasExistingValue, serializer); + } + + public override void WriteJson(JsonWriter writer, IList? value, JsonSerializer serializer) + { + _converter.WriteJson(writer, ConvertIListToList(value), serializer); + } + + private List? ConvertIListToList(IList? src) + { + if (src == null) + return null; + + List? dest = src as List; + if (dest != null) + return dest; + + return new List(src); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32ListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32ListConverter.cs new file mode 100644 index 00000000..49073943 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarInt32ListConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class SeparatedByVBarInt32ListConverter : JsonConverter?> + { + private readonly JsonConverter _converter = new SeparatedByVBarInt32ArrayConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override List? ReadJson(JsonReader reader, Type objectType, List? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, existingValue?.ToArray(), hasExistingValue, serializer)?.ToList(); + } + + public override void WriteJson(JsonWriter writer, List? value, JsonSerializer serializer) + { + _converter.WriteJson(writer, value?.ToArray(), serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringArrayConverter.cs new file mode 100644 index 00000000..b5a622ad --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringArrayConverter.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class SeparatedByVBarStringArrayConverter : JsonConverter + { + private const string SEPARATOR = "|"; + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override string[]? ReadJson(JsonReader reader, Type objectType, string[]? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + return value.Split(new string[] { SEPARATOR }, StringSplitOptions.RemoveEmptyEntries); + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, string[]? value, JsonSerializer serializer) + { + if (value != null) + writer.WriteValue(string.Join(SEPARATOR, value)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringIListConverter.cs new file mode 100644 index 00000000..4690fd17 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringIListConverter.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class SeparatedByVBarStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new SeparatedByVBarStringListConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override IList? ReadJson(JsonReader reader, Type objectType, IList? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, ConvertIListToList(existingValue), hasExistingValue, serializer); + } + + public override void WriteJson(JsonWriter writer, IList? value, JsonSerializer serializer) + { + _converter.WriteJson(writer, ConvertIListToList(value), serializer); + } + + private List? ConvertIListToList(IList? src) + { + if (src == null) + return null; + + List? dest = src as List; + if (dest != null) + return dest; + + return new List(src); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringListConverter.cs new file mode 100644 index 00000000..bd2bf6cf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/Newtonsoft.Json/SeparatedByVBarStringListConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class SeparatedByVBarStringListConverter : JsonConverter?> + { + private readonly JsonConverter _converter = new SeparatedByVBarStringArrayConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override List? ReadJson(JsonReader reader, Type objectType, List? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, existingValue?.ToArray(), hasExistingValue, serializer)?.ToList(); + } + + public override void WriteJson(JsonWriter writer, List? value, JsonSerializer serializer) + { + _converter.WriteJson(writer, value?.ToArray(), serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32ArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32ArrayConverter.cs new file mode 100644 index 00000000..42fcc183 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32ArrayConverter.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class SeparatedByVBarInt32ArrayConverter : JsonConverter + { + private const string SEPARATOR = "|"; + + public override int[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + try + { + return value + .Split(new string[] { SEPARATOR }, StringSplitOptions.RemoveEmptyEntries) + .Select(e => int.Parse(e)) + .ToArray(); + } + catch (FormatException ex) + { + throw new JsonException(ex.Message, ex); + } + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, int[]? value, JsonSerializerOptions options) + { + if (value != null) + writer.WriteStringValue(string.Join(SEPARATOR, value)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32IListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32IListConverter.cs new file mode 100644 index 00000000..1abbfc50 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32IListConverter.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class SeparatedByVBarInt32IListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new SeparatedByVBarInt32ListConverter(); + + public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options); + } + + public override void Write(Utf8JsonWriter writer, IList? value, JsonSerializerOptions options) + { + _converter.Write(writer, ConvertIListToList(value), options); + } + + private List? ConvertIListToList(IList? src) + { + if (src == null) + return null; + + List? dest = src as List; + if (dest != null) + return dest; + + return new List(src); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32ListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32ListConverter.cs new file mode 100644 index 00000000..8414fc55 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarInt32ListConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class SeparatedByVBarInt32ListConverter : JsonConverter?> + { + private readonly JsonConverter _converter = new SeparatedByVBarInt32ArrayConverter(); + + public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options)?.ToList(); + } + + public override void Write(Utf8JsonWriter writer, List? value, JsonSerializerOptions options) + { + _converter.Write(writer, value?.ToArray(), options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringArrayConverter.cs new file mode 100644 index 00000000..1143f9a0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringArrayConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class SeparatedByVBarStringArrayConverter : JsonConverter + { + private const string SEPARATOR = "|"; + + public override string[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + return value.Split(new string[] { SEPARATOR }, StringSplitOptions.RemoveEmptyEntries); + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, string[]? value, JsonSerializerOptions options) + { + if (value != null) + writer.WriteStringValue(string.Join(SEPARATOR, value)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringIListConverter.cs new file mode 100644 index 00000000..b3f038b1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringIListConverter.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class SeparatedByVBarStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new SeparatedByVBarStringListConverter(); + + public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options); + } + + public override void Write(Utf8JsonWriter writer, IList? value, JsonSerializerOptions options) + { + _converter.Write(writer, ConvertIListToList(value), options); + } + + private List? ConvertIListToList(IList? src) + { + if (src == null) + return null; + + List? dest = src as List; + if (dest != null) + return dest; + + return new List(src); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringListConverter.cs new file mode 100644 index 00000000..59d819cb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Converters/System.Text.Json/SeparatedByVBarStringListConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class SeparatedByVBarStringListConverter : JsonConverter?> + { + private readonly JsonConverter _converter = new SeparatedByVBarStringArrayConverter(); + + public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options)?.ToList(); + } + + public override void Write(Utf8JsonWriter writer, List? value, JsonSerializerOptions options) + { + _converter.Write(writer, value?.ToArray(), options); + } + } +}