Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将包含JSON内容的字符串反序列化为C#对象_C#_Json.net_Dotnet Httpclient - Fatal编程技术网

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

无法将包含JSON内容的字符串反序列化为C#对象,c#,json.net,dotnet-httpclient,C#,Json.net,Dotnet Httpclient,我有一个HttpClient,它调用restapi var response = await client.PostAsync("Payments/CreditCard", content); var contents = await response.Content.ReadAsStringAsync(); 当我以字符串形式读取响应内容时,我得到以下结果: "\"{\\\"ssl_card_number\\\":\\\"41**********9994\\\",\\\"ssl_exp_dat

我有一个HttpClient,它调用restapi

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#对象时,我收到一个异常,因为contents变量无法转换为我的C#对象。 但是,如果我从文本可视化工具获取字符串,我就能够成功地将其转换为我的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);
paymentResponse=JsonConvert.DeserializeObject(内容);

如何使我的contents变量的值与文本可视化工具中显示的值相同?

@Nkosi是正确的:首先将其反序列化为
字符串,然后再反序列化为
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);
目前,该地区的主要内容是:一名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名“Test\\\”:\\\“\\\”,\\\“TestField\\”:\\\“TestValue\\”\\\目前,除了除了除了“批准”以外,除了除了除了“批准”以外,除了除了除了除了“批准”以外,除了除了除了除了除了“批准”以外,除了除了除了除了除了除了“批准”以外,除了除了除了除了除了除了除了除了“ssl泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥泥测试测试结果结果结果结果结果的测试测试测试测试测试结果的编码编码\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\键入\\\\”:\\\“信用卡\\\\”}\”; var contentAsString=JsonConvert.DeserializeObject(内容); var paymentResponse=JsonConvert.DeserializeObject(contentAsString); Console.WriteLine(paymentResponse.ssl\u卡号);

检查。

显示的数据似乎已序列化两次

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

首先到
字符串

var json = JsonConvert.DeserializeObject<string>(contents);
var json=JsonConvert.DeserializeObject(内容);
然后是所需的类型

var paymentResponse = JsonConvert.DeserializeObject<PaymentResponse>(json);
var paymentResponse=JsonConvert.DeserializeObject(json);
这是解决方案。实际上,在反序列化到对象时,我们需要注意编码。因为对象的内容字符串有时会有ASCII字符集以外的字符集。这对我来说很好

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

如果您可以控制数据源,请检查以确保您没有双重序列化dataPost您的类和反序列化代码。@AndersonPimentel,我已经添加了用于反序列化的类和代码。@Nkosi,按源代码说,您是指API的响应吗?如果是,我无法控制它。这可能只是一个猜测,但是反序列化两次怎么样?首先是字符串,然后是所需的类型