C# 无法读取来自C中Web API的json#
无法将webapi值读取到列表对象。请查看链接中的屏幕截图值。 错误为Newtonsoft.Json.JsonSerializationException:'无法将当前Json对象(例如,{“名称”:“值”})反序列化为'System.Collections.Generic.List`1[StudentProfileClient.StudentInfo],因为该类型需要Json数组(例如[1,2,3])才能正确反序列化。 若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为可以从JSON对象反序列化的正常.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。 路径“数据”,第2行,位置10'C# 无法读取来自C中Web API的json#,c#,asp.net-web-api,C#,Asp.net Web Api,无法将webapi值读取到列表对象。请查看链接中的屏幕截图值。 错误为Newtonsoft.Json.JsonSerializationException:'无法将当前Json对象(例如,{“名称”:“值”})反序列化为'System.Collections.Generic.List`1[StudentProfileClient.StudentInfo],因为该类型需要Json数组(例如[1,2,3])才能正确反序列化。 若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更
class StudentInfo
{
public string cellPhone { get; set; }
public string gender { get; set; }
public string dateOfBirth { get; set; }
}
class RootClass
{
public int TotalCount { get; set; }
public List<StudentInfo> stdinfo { get; set; }
}
static async Task GetData()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://203.81.70.102:8092/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response;
response = await client.GetAsync("control/qZkNkcGgWq6PiVbJzQ2=/student-profiles");
if (response.IsSuccessStatusCode)
{
List<StudentInfo> RootClass = new List<StudentInfo>();
RootClass = await response.Content.ReadAsAsync<List<StudentInfo>>();
}
}
}
班级学生信息
{
公共字符串{get;set;}
公共字符串{get;set;}
公共字符串dateOfBirth{get;set;}
}
类根类
{
公共整数TotalCount{get;set;}
公共列表stdinfo{get;set;}
}
静态异步任务GetData()
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(“http://203.81.70.102:8092/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage响应;
response=wait client.GetAsync(“control/qzknkcgwq6pivbjzq2=/student profiles”);
if(响应。IsSuccessStatusCode)
{
List RootClass=new List();
RootClass=wait response.Content.ReadAsAsync();
}
}
}
您不能使用JsonConvert.DeserializeObject直接从API响应反序列化
JObject jsonResponse = JObject.Parse(jsonString);
JObject objResponse = (JObject)jsonResponse["response"];
Dictionary<string, JArray> _Data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, JArray>>(objResponse.ToString());
JObject-jsonResponse=JObject.Parse(jsonString);
JObject objResponse=(JObject)jsonResponse[“response”];
Dictionary _Data=Newtonsoft.Json.JsonConvert.DeserializeObject(objResponse.ToString());
使用以下命令,而不是将RootClass声明为List:
var RootClass=await response.Content.ReadAsAsync()
在行中放置断点,并检查从API返回的类型。由于var将接受任何内容,您可以检查响应。基本上,您的错误表示您试图强制转换为无效类型,因此反序列化无法正常工作
返回的对象似乎是一个数组,可能需要获取数组并将其转换为列表,或者甚至是一个与预期对象完全不同的对象,具有其他属性,等等
解决->调试的最佳方法,并确保使用正确的类型来反序列化,这样就有了一个名为RootClass的类。 你有一个叫做StudentInfo的课程 你希望得到哪一个? 看来你得到了完全不同的东西。 正如我在这里看到的,您应该创建一个新类(或更改RootClass结构),如下所示
class ResponseContainer
{
public List<StudentInfo> data { get; set; }
}
类响应容器
{
公共列表数据{get;set;}
}
而不是直接反序列化到列表中,您应该反序列化到此ResponseContainer类:
var response = await response.Content.ReadAsAsync<ResponseContainer>();
var response=wait response.Content.ReadAsAsync();
p、 如果要使用RootClass,应将属性stdinfo重命名为“data”,或添加如下JsonProperty属性:
class RootClass
{
public int TotalCount { get; set; }
[JsonProperty(PropertyName = "data")]
public List<StudentInfo> stdinfo { get; set; }
}
class根类
{
公共整数TotalCount{get;set;}
[JsonProperty(PropertyName=“data”)]
公共列表stdinfo{get;set;}
}
1)在Newtonsoft.json
中使用JObject
在PackageManager控制台中键入以下命令
安装软件包Newtonsoft.Json
if (response.IsSuccessStatusCode)
{
string json = await response.Content.ReadAsStringAsync();
JObject jObject = JObject.Parse(json);
List<StudentInfo> studentInfos = jObject["data"].ToObject<List<StudentInfo>>();
}
输出:
所以你的课会很有趣
public class StudentInfo
{
public int sl { get; set; }
public string studentId { get; set; }
public string studentName { get; set; }
public string school { get; set; }
public string program { get; set; }
public string fatherName { get; set; }
public string motherName { get; set; }
public string cellPhone { get; set; }
public string gender { get; set; }
public string dateOfBirth { get; set; }
}
public class RootClass
{
public List<StudentInfo> data { get; set; }
public string message { get; set; }
public int total { get; set; }
}
公共班级学生信息
{
公共int sl{get;set;}
公共字符串studentId{get;set;}
公共字符串studentName{get;set;}
公共字符串学校{get;set;}
公共字符串程序{get;set;}
公共字符串父名称{get;set;}
公共字符串名称{get;set;}
公共字符串{get;set;}
公共字符串{get;set;}
公共字符串dateOfBirth{get;set;}
}
公共类根类
{
公共列表数据{get;set;}
公共字符串消息{get;set;}
公共整数总计{get;set;}
}
简单的解决方案,您需要一个包装器
这在实践中是什么样子的?它只是意味着返回对象列表的API将列表包装在顶级对象中。例如,假设您的API中有一个Person数据类型。如果只有一个人,您可能会得到以下JSON响应:
{ "name": "John Smith" }
到目前为止一切都很好。但是如果你想要一个列表而不是一个呢?最直观的方法可能如下所示:
[{"name": "John Smith"}, {"name": "Jane Smith"}]
但这正是我们需要避免的情况。因此,我们需要
将顶级对象用于具有单个数据属性的列表,例如:
{"data": [{"name": "John Smith"}, {"name": "Jane Smith"}]}
所以
Class Students{
public List<StudentInfo> roots{get;set;}
}
班级学生{
公共列表根{get;set;}
}
保留您的学生类,添加我的学生类,并反序列化到该类 你不能使用JsonConvert.DeserializeObject直接从API响应反序列化。你能告诉我应该在哪里更正我的代码吗..我会很有帮助的这些都是假的。感谢您的提醒…。@Md.RayhanKhan,您能显示您的json吗?“Content.ReadAsAsync>“why”>“我想这是一个输入错误。您仍在尝试将其强制转换为列表(在readasync的通用参数中)…很遗憾,我无法在此处运行代码,但我非常确定这是您的错误-无效强制转换。尝试在没有ReadAsAsync泛型的情况下使用对象读取或重载。您可以
Class Students{
public List<StudentInfo> roots{get;set;}
}