无法将带有JSON内容的字符串反序列化为C#对象

时间:2018-04-09 14:34:48

标签: c# json.net dotnet-httpclient

我有一个HttpClient来调用REST API。

var response = await client.PostAsync("Payments/CreditCard", content);
var contents = await response.Content.ReadAsStringAsync();

当我以字符串形式读取响应的内容时,我得到以下结果:

"\"{\\\"ssl_card_number\\\":\\\"41**********9994\\\",\\\"ssl_exp_date\\\":\\\"1219\\\",\\\"ssl_amount\\\":\\\"50.00\\\",\\\"ssl_salestax\\\":\\\"\\\",\\\"ssl_invoice_number\\\":\\\"\\\",\\\"ssl_departure_date\\\":\\\"\\\",\\\"ssl_completion_date\\\":\\\"\\\",\\\"Test\\\":\\\"\\\",\\\"TestField\\\":\\\"TestValue\\\",\\\"ssl_result\\\":\\\"0\\\",\\\"ssl_result_message\\\":\\\"APPROVAL\\\",\\\"ssl_approval_code\\\":\\\"578380\\\",\\\"ssl_cvv2_response\\\":\\\"U\\\",\\\"ssl_avs_response\\\":\\\"G\\\",\\\"ssl_account_balance\\\":\\\"0.00\\\",\\\"ssl_txn_time\\\":\\\"04/09/2018 09:41:01 AM\\\",\\\"ssl_card_type\\\":\\\"CREDITCARD\\\"}\""

当我调试并检查contents变量的值时,它包含以下内容:

enter image description here

当我尝试使用JSON.Net将字符串反序列化为C#对象时,我收到一个异常,因为content变量无法转换为我的C#对象。 但是,如果我从Text Visualizer中获取字符串,我就能成功将其转换为我的C#对象。

在这里,我尝试将字符串内容反序列化为:

public class PaymentResponse
{
     public string ssl_account_balance { get; set; }
     public string ssl_amount { get; set; }
     public string ssl_approval_code { get; set; }
     public string ssl_avs_response { get; set; }
     public string ssl_card_number { get; set; }
     public string ssl_card_type { get; set; }
     public string ssl_completion_date { get; set; }
     public string ssl_cvv2_response { get; set; }
     public string ssl_departure_date { get; set; }
     public string ssl_exp_date { get; set; }
     public string ssl_invoice_number { get; set; }
     public string ssl_result { get; set; }
     public string ssl_result_message { get; set; }
     public string ssl_salestax { get; set; }
     public string ssl_txn_id { get; set; }
     public string ssl_txn_time { get; set; }
}

这是我用于反序列化的代码:

paymentResponse = JsonConvert.DeserializeObject<PaymentResponse>(contents);

如何让我的内容变量具有与Text Visualizer中显示的相同的值?

3 个答案:

答案 0 :(得分:4)

@Nkosi是对的:先将其反序列化为string,然后再PaymentResponse

var contents = "\"{\\\"ssl_card_number\\\":\\\"41**********9994\\\",\\\"ssl_exp_date\\\":\\\"1219\\\",\\\"ssl_amount\\\":\\\"50.00\\\",\\\"ssl_salestax\\\":\\\"\\\",\\\"ssl_invoice_number\\\":\\\"\\\",\\\"ssl_departure_date\\\":\\\"\\\",\\\"ssl_completion_date\\\":\\\"\\\",\\\"Test\\\":\\\"\\\",\\\"TestField\\\":\\\"TestValue\\\",\\\"ssl_result\\\":\\\"0\\\",\\\"ssl_result_message\\\":\\\"APPROVAL\\\",\\\"ssl_approval_code\\\":\\\"578380\\\",\\\"ssl_cvv2_response\\\":\\\"U\\\",\\\"ssl_avs_response\\\":\\\"G\\\",\\\"ssl_account_balance\\\":\\\"0.00\\\",\\\"ssl_txn_time\\\":\\\"04/09/2018 09:41:01 AM\\\",\\\"ssl_card_type\\\":\\\"CREDITCARD\\\"}\"";
var contentAsString = JsonConvert.DeserializeObject<string>(contents);
var paymentResponse = JsonConvert.DeserializeObject<PaymentResponse>(contentAsString);
Console.WriteLine(paymentResponse.ssl_card_number);

检查fiddle

答案 1 :(得分:4)

显示的数据似乎被序列化了两次。

在这种情况下,它需要反序列化两次。

首先到string

var json = JsonConvert.DeserializeObject<string>(contents);

然后到所需的类型

var paymentResponse = JsonConvert.DeserializeObject<PaymentResponse>(json);

答案 2 :(得分:0)

这是解决方案。实际上,在反序列化对象时,我们需要注意编码。由于对象的内容字符串有时会具有非ASCII字符集。对我来说很好。

var resultBytes = await response.Content.ReadAsByteArrayAsync();
var actualEncodedString = Encoding.UTF8.GetString(resultBytes);
var actualObject = JsonConvert.DeserializeObject<T>(actualEncodedString);