1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-09 00:46:19 +00:00

Seperated validate json call, error parsing now receive JToken

This commit is contained in:
JKorf 2018-12-03 16:11:06 +01:00
parent b4d45b4194
commit 8a4e8403d2
3 changed files with 62 additions and 28 deletions

View File

@ -97,10 +97,9 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations
public ParseErrorTestRestClient() { }
public ParseErrorTestRestClient(ClientOptions exchangeOptions) : base(exchangeOptions) { }
protected override Error ParseErrorResponse(string error)
protected override Error ParseErrorResponse(JToken error)
{
var data = JToken.Parse(error);
return new ServerError((int)data["errorCode"], (string)data["errorMessage"]);
return new ServerError((int)error["errorCode"], (string)error["errorMessage"]);
}
}
}

View File

@ -62,6 +62,37 @@ namespace CryptoExchange.Net
authProvider = authenticationProvider;
}
/// <summary>
/// Tries to parse the json data and returns a token
/// </summary>
/// <param name="data">The data to parse</param>
/// <returns></returns>
protected CallResult<JToken> ValidateJson(string data)
{
try
{
return new CallResult<JToken>(JToken.Parse(data), null);
}
catch (JsonReaderException jre)
{
var info = $"Deserialize JsonReaderException: {jre.Message}, Path: {jre.Path}, LineNumber: {jre.LineNumber}, LinePosition: {jre.LinePosition}. Data: {data}";
log.Write(LogVerbosity.Error, info);
return new CallResult<JToken>(null, new DeserializeError(info));
}
catch (JsonSerializationException jse)
{
var info = $"Deserialize JsonSerializationException: {jse.Message}. Data: {data}";
log.Write(LogVerbosity.Error, info);
return new CallResult<JToken>(null, new DeserializeError(info));
}
catch (Exception ex)
{
var info = $"Deserialize Unknown Exception: {ex.Message}. Data: {data}";
log.Write(LogVerbosity.Error, info);
return new CallResult<JToken>(null, new DeserializeError(info));
}
}
/// <summary>
/// Deserialize a string into an object
/// </summary>
@ -72,28 +103,10 @@ namespace CryptoExchange.Net
/// <returns></returns>
protected CallResult<T> Deserialize<T>(string data, bool checkObject = true, JsonSerializer serializer = null)
{
try
{
return Deserialize<T>(JToken.Parse(data), checkObject, serializer);
}
catch (JsonReaderException jre)
{
var info = $"Deserialize JsonReaderException: {jre.Message}, Path: {jre.Path}, LineNumber: {jre.LineNumber}, LinePosition: {jre.LinePosition}. Data: {data}";
log.Write(LogVerbosity.Error, info);
return new CallResult<T>(default(T), new DeserializeError(info));
}
catch (JsonSerializationException jse)
{
var info = $"Deserialize JsonSerializationException: {jse.Message}. Data: {data}";
log.Write(LogVerbosity.Error, info);
return new CallResult<T>(default(T), new DeserializeError(info));
}
catch (Exception ex)
{
var info = $"Deserialize Unknown Exception: {ex.Message}. Data: {data}";
log.Write(LogVerbosity.Error, info);
return new CallResult<T>(default(T), new DeserializeError(info));
}
var tokenResult = ValidateJson(data);
if(!tokenResult.Success)
return new CallResult<T>(default(T), tokenResult.Error);
return Deserialize<T>(tokenResult.Data, checkObject, serializer);
}
/// <summary>

View File

@ -13,8 +13,10 @@ using CryptoExchange.Net.Authentication;
using CryptoExchange.Net.Interfaces;
using CryptoExchange.Net.Logging;
using CryptoExchange.Net.Objects;
using CryptoExchange.Net.RateLimiter;
using CryptoExchange.Net.Requests;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace CryptoExchange.Net
{
@ -158,7 +160,27 @@ namespace CryptoExchange.Net
log.Write(LogVerbosity.Debug, $"Sending {method}{(signed ? " signed" : "")} request to {request.Uri} {(paramString ?? "")}");
var result = await ExecuteRequest(request).ConfigureAwait(false);
return result.Error != null ? new CallResult<T>(null, result.Error) : Deserialize<T>(result.Data, checkResult);
if(!result.Success)
return new CallResult<T>(null, result.Error);
var jsonResult = ValidateJson(result.Data);
if(!jsonResult.Success)
return new CallResult<T>(null, jsonResult.Error);
if (IsErrorResponse(jsonResult.Data))
return new CallResult<T>(null, ParseErrorResponse(jsonResult.Data));
return Deserialize<T>(jsonResult.Data, checkResult);
}
/// <summary>
/// Can be overridden to indicate if a response is an error response
/// </summary>
/// <param name="data">The received data</param>
/// <returns>True if error response</returns>
protected virtual bool IsErrorResponse(JToken data)
{
return false;
}
/// <summary>
@ -304,9 +326,9 @@ namespace CryptoExchange.Net
/// </summary>
/// <param name="error">The string the request returned</param>
/// <returns></returns>
protected virtual Error ParseErrorResponse(string error)
protected virtual Error ParseErrorResponse(JToken error)
{
return new ServerError(error);
return new ServerError(error.ToString());
}
}
}