diff --git a/CryptoExchange.Net/Converters/SystemTextJson/EmptyArrayObjectConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/EmptyArrayObjectConverter.cs new file mode 100644 index 0000000..b3486f3 --- /dev/null +++ b/CryptoExchange.Net/Converters/SystemTextJson/EmptyArrayObjectConverter.cs @@ -0,0 +1,37 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace CryptoExchange.Net.Converters.SystemTextJson +{ + /// + /// Converter mapping to an object but also handles when an empty array is send + /// + /// + public class EmptyArrayObjectConverter : JsonConverter + { + private static JsonSerializerOptions _defaultConverter = SerializerOptions.WithConverters; + + /// + public override T? Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case JsonTokenType.StartArray: + _ = JsonSerializer.Deserialize(ref reader, options); + return default; + case JsonTokenType.StartObject: + return JsonSerializer.Deserialize(ref reader, _defaultConverter); + }; + + return default; + } + + /// + public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) + => JsonSerializer.Serialize(writer, (object?)value, options); + } +} diff --git a/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs b/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs index 5e57192..d7969db 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs @@ -21,6 +21,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson protected JsonDocument? _document; private static JsonSerializerOptions _serializerOptions = SerializerOptions.WithConverters; + private JsonSerializerOptions? _customSerializerOptions; /// public bool IsJson { get; set; } @@ -31,6 +32,21 @@ namespace CryptoExchange.Net.Converters.SystemTextJson /// public object? Underlying => throw new NotImplementedException(); + /// + /// ctor + /// + public SystemTextJsonMessageAccessor() + { + } + + /// + /// ctor + /// + public SystemTextJsonMessageAccessor(JsonSerializerOptions options) + { + _customSerializerOptions = options; + } + /// public CallResult Deserialize(Type type, MessagePath? path = null) { @@ -42,7 +58,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson try { - var result = _document.Deserialize(type, _serializerOptions); + var result = _document.Deserialize(type, _customSerializerOptions ?? _serializerOptions); return new CallResult(result!); } catch (JsonException ex) @@ -65,7 +81,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson try { - var result = _document.Deserialize(_serializerOptions); + var result = _document.Deserialize(_customSerializerOptions ?? _serializerOptions); return new CallResult(result!); } catch (JsonException ex) @@ -129,7 +145,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson { try { - return value.Value.Deserialize(_serializerOptions); + return value.Value.Deserialize(_customSerializerOptions ?? _serializerOptions); } catch { } return default; @@ -223,6 +239,20 @@ namespace CryptoExchange.Net.Converters.SystemTextJson /// public override bool OriginalDataAvailable => _stream?.CanSeek == true; + /// + /// ctor + /// + public SystemTextJsonStreamMessageAccessor(): base() + { + } + + /// + /// ctor + /// + public SystemTextJsonStreamMessageAccessor(JsonSerializerOptions options): base(options) + { + } + /// public async Task Read(Stream stream, bool bufferStream) { @@ -286,6 +316,20 @@ namespace CryptoExchange.Net.Converters.SystemTextJson { private ReadOnlyMemory _bytes; + /// + /// ctor + /// + public SystemTextJsonByteMessageAccessor() : base() + { + } + + /// + /// ctor + /// + public SystemTextJsonByteMessageAccessor(JsonSerializerOptions options) : base(options) + { + } + /// public CallResult Read(ReadOnlyMemory data) {