无法将内容为 JSON 的字符串反序列化为 C# 对象
Unable to Deserialize String with JSON Contents to C# Object
我有一个调用 REST 的 HttpClient 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
变量的值时,它包含以下内容:
当我尝试使用 JSON.Net 将字符串反序列化为 C# 对象时,我收到一个异常,因为无法将内容变量转换为我的 C# 对象。
但是,如果我从 Text Visualizer 中获取字符串,我就能够成功地将它转换为我的 C# 对象。
这是 class 我正在尝试将字符串内容反序列化为:
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);
如何让我的内容变量具有与文本可视化工具中显示的相同的值?
@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。
显示的数据似乎被序列化了两次。
在那种情况下,它需要反序列化两次。
先到string
,
var json = JsonConvert.DeserializeObject<string>(contents);
然后到想要的类型
var paymentResponse = JsonConvert.DeserializeObject<PaymentResponse>(json);
这是解决方案。实际上我们需要在反序列化为对象时注意编码。由于对象的内容字符串有时会有 ASCII 字符集以外的字符集。它对我来说很好。
var resultBytes = await response.Content.ReadAsByteArrayAsync();
var actualEncodedString = Encoding.UTF8.GetString(resultBytes);
var actualObject = JsonConvert.DeserializeObject<T>(actualEncodedString);
我有一个调用 REST 的 HttpClient 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
变量的值时,它包含以下内容:
当我尝试使用 JSON.Net 将字符串反序列化为 C# 对象时,我收到一个异常,因为无法将内容变量转换为我的 C# 对象。 但是,如果我从 Text Visualizer 中获取字符串,我就能够成功地将它转换为我的 C# 对象。
这是 class 我正在尝试将字符串内容反序列化为:
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);
如何让我的内容变量具有与文本可视化工具中显示的相同的值?
@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。
显示的数据似乎被序列化了两次。
在那种情况下,它需要反序列化两次。
先到string
,
var json = JsonConvert.DeserializeObject<string>(contents);
然后到想要的类型
var paymentResponse = JsonConvert.DeserializeObject<PaymentResponse>(json);
这是解决方案。实际上我们需要在反序列化为对象时注意编码。由于对象的内容字符串有时会有 ASCII 字符集以外的字符集。它对我来说很好。
var resultBytes = await response.Content.ReadAsByteArrayAsync();
var actualEncodedString = Encoding.UTF8.GetString(resultBytes);
var actualObject = JsonConvert.DeserializeObject<T>(actualEncodedString);