mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2026-04-07 02:01:12 +00:00
Updated time sync / time offset management for REST API's Added time offset tracking for WebSocket API's Added GetAuthenticationQuery virtual method on AuthenticationProvider Updated AuthenticationProvider GetTimestamp methods to include a one second offset by default Added AuthenticationProvider GetTimestamp methods for SocketApiClient instances Added ClientName property on BaseApiClient, resolving to the type name Added ObjectOrArrayConverter JsonConverterFactory implementation for resolving json data which might be returned as object or array Added UpdateServerTime, UpdateLocalTime and DataAge properties to (I)SymbolOrderBook Added OutputToConsoleAsync method to (I)SymbolOrderBook Updated SymbolOrderBook string representation Added DataTimeLocal and DataAge properties to DataEvent object Added SocketConnection parameter to subscription HandleSubQueryResponse and HandleUnsubQueryResponse methods
59 lines
2.4 KiB
C#
59 lines
2.4 KiB
C#
using System;
|
|
using System.Text.Json;
|
|
using System.Text.Json.Serialization;
|
|
|
|
#pragma warning disable IL2026 // Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code
|
|
#pragma warning disable IL3050 // Calling members annotated with 'RequiresDynamicCodeAttribute' may break functionality when AOT compiling.
|
|
|
|
namespace CryptoExchange.Net.Converters.SystemTextJson
|
|
{
|
|
/// <summary>
|
|
/// Converter for parsing object or array responses
|
|
/// </summary>
|
|
public class ObjectOrArrayConverter : JsonConverterFactory
|
|
{
|
|
/// <inheritdoc />
|
|
public override bool CanConvert(Type typeToConvert) => true;
|
|
/// <inheritdoc />
|
|
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
|
|
{
|
|
var type = typeof(InternalObjectOrArrayConverter<>).MakeGenericType(typeToConvert);
|
|
return (JsonConverter)Activator.CreateInstance(type)!;
|
|
}
|
|
|
|
private class InternalObjectOrArrayConverter<T> : JsonConverter<T>
|
|
{
|
|
public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
{
|
|
if (reader.TokenType == JsonTokenType.StartObject && !typeToConvert.IsArray)
|
|
{
|
|
// Object to object
|
|
return JsonDocument.ParseValue(ref reader).Deserialize<T>(options);
|
|
}
|
|
else if (reader.TokenType == JsonTokenType.StartArray && typeToConvert.IsArray)
|
|
{
|
|
// Array to array
|
|
return JsonDocument.ParseValue(ref reader).Deserialize<T>(options);
|
|
}
|
|
else if (reader.TokenType == JsonTokenType.StartArray)
|
|
{
|
|
// Array to object
|
|
JsonDocument.ParseValue(ref reader).Deserialize<T[]>(options);
|
|
return default;
|
|
}
|
|
else
|
|
{
|
|
// Object to array
|
|
JsonDocument.ParseValue(ref reader);
|
|
return default;
|
|
}
|
|
}
|
|
|
|
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
|
|
{
|
|
JsonSerializer.Serialize(writer, value, options);
|
|
}
|
|
}
|
|
}
|
|
}
|