C# 无法读取来自C中Web API的json#

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]),或更

无法将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'

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;}

}