I have these model classes:
public class TransactionInfo
{
public int request_id { get; set; }
public DateTime request_date { get; set; }
public double request_amount { get; set; }
public int request_count { get; set; }
public string national_code { get; set; }
public DateTime nav_date { get; set; }
public DateTime approved_date { get; set; }
public double nav_value { get; set; }
public string request_type { get; set; }
public string request_state { get; set; }
public string username { get; set; }
public string request_serial { get; set; }
public double request_fixed_wage { get; set; }
public double request_variable_wage { get; set; }
}
public class TransactionMessage
{
public TransactionInfo info { get; set; }
public string message_date { get; set; }
public string message_type { get; set; }
public string portfolio_code { get; set; }
public string workingday_date { get; set; }
public string event_type { get; set; }
}
And here is my JSON data:
"{\"info\":{\"request_id\":148786,\"request_date\":\"2022-09-04T12:23:00\",\"request_amount\":123.0,\"request_count\":-1,\"national_code\":\"1045451\",\"nav_date\":\"2022-09-05T00:00:00\",\"approved_date\":\"2022-09-06T00:00:00\",\"nav_value\":0.0,\"request_type\":\"SUBSCRIPTION\",\"request_state\":\"PENDING\",\"username\":\"a.daszarrin\",\"request_serial\":\"123\",\"request_fixed_wage\":0.0,\"request_variable_wage\":0.0},\"event_type\":\"REQUEST_CREATED\",\"message_date\":\"2022-09-04 12:23:26\",\"message_type\":\"REQUEST\",\"portfolio_code\":\"10851\",\"workingday_date\":\"2022-09-04\"}"
My code:
var rawData = JsonSerializer.Deserialize<TransactionMessage>(Value);
When I want to convert value to model I get this error :
System.Text.Json.JsonException: 'The JSON value could not be converted to fund.api.TransactionMessage. Path: $ | LineNumber: 0 | BytePositionInLine: 599.'
StackTrace
at System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value) at System.Text.Json.Serialization.JsonConverter
1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan
1 utf8Json, JsonTypeInfo jsonTypeInfo, Nullable1 actualByteCount) at System.Text.Json.JsonSerializer.Deserialize[TValue](ReadOnlySpan
1 utf8Json, JsonSerializerOptions options)
at fund.api.FundHostedService.<b__8_0>d.MoveNext() in D:\gitProjects\Orbis.fund.api\FundHostedService.cs:line 74
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at infrastructure.Queue.RabbitMQ.RabbitMQConsumer.<>c__DisplayClass4_0.<b__0>d.MoveNext() in D:\infrastructure\Queue\RabbitMQ\RabbitMQConsumer.cs:line 33
As a note when I convert the array to test I get the exact value of json:
var data = System.Text.Encoding.Default.GetString((eventArgs.Body.ToArray()));
Update 1 - here is my consumer of my rabbit mq:
private Task StartFundTransactionResultConsuming()
=> _rabbitMQConsumer.Consume(QUEUE_TRANSACTION_CONSUMER_NAME, async (payload) =>
{
var rawData = JsonSerializer.Deserialize<TransactionMessage>(payload);
if (rawData is null)
return;
Log.Logger.Information($"fund.api.TransactionConsumer, has Data: {JsonSerializer.Serialize(rawData)}");
var redisResult = await _cache.KeyDeleteAsync(nameof(TransactionsEntity) + $":{rawData.info.national_code}");
if (!redisResult)
{
Serilog.Log.Logger.Error($"fund.api.TransactionConsumer, redis can't delete transaction for customer: {rawData.info.national_code}");
}
});
And here is my consumer :
public Task Consume(string topic, Func<byte[], Task> callback)
{
ConnectToRabbitMq();
var consumer = new AsyncEventingBasicConsumer(_channel);
consumer.Received += async (_, eventArgs) =>
{
try
{
await callback(eventArgs.Body.ToArray());
}
catch(JsonException aa)
{
Console.WriteLine(nameof(Consume) +":" + aa.ToString());
}
catch (Exception ex)
{
var data = System.Text.Encoding.Default.GetString((eventArgs.Body.ToArray()));
Serilog.Log.Logger.Error($"Rabbit Consumer exception :{ex.ToString()} with Data:{System.Text.Encoding.Default.GetString((eventArgs.Body.ToArray())) }");
Console.WriteLine(nameof(Consume) +":" + ex.ToString());
}
_channel.BasicAck(eventArgs.DeliveryTag, multiple: false);
};
_channel.BasicConsume(topic, autoAck: false, consumer);
return Task.CompletedTask;
}