C# 反序列化json对象不起作用

C# 反序列化json对象不起作用,c#,json,deserialization,C#,Json,Deserialization,我想将json对象反序列化到我的学生类 var result = JsonConvert.DeserializeObject<Student>(data); [Serializable] public class Student { [JsonProperty("fname")] public string FirstName{ get; set; } [JsonProperty("lname")] public string LastName{ g

我想将json对象反序列化到我的学生类

var result = JsonConvert.DeserializeObject<Student>(data);
[Serializable]
public class Student
{
    [JsonProperty("fname")]
    public string FirstName{ get; set; }
    [JsonProperty("lname")]
    public string LastName{ get; set; }
    [JsonProperty("subject")]
    public string Subject { get; set; }
    [JsonProperty("grade")]
    public string Grade { get; set; }
 }
我的学生班

var result = JsonConvert.DeserializeObject<Student>(data);
[Serializable]
public class Student
{
    [JsonProperty("fname")]
    public string FirstName{ get; set; }
    [JsonProperty("lname")]
    public string LastName{ get; set; }
    [JsonProperty("subject")]
    public string Subject { get; set; }
    [JsonProperty("grade")]
    public string Grade { get; set; }
 }
代码不起作用,错误显示:

无法将当前JSON对象(例如{name:value})反序列化为类型 因为类型需要JSON数组,例如[1,2,3]才能正确反序列化


如果必须使用下载的json,则需要创建另一个模型 为它上课

[Serializable]
public class Student
{
    [JsonProperty("fname")]
    public string FirstName{ get; set; }
    [JsonProperty("lname")]
    public string LastName{ get; set; }
    [JsonProperty("subject")]
    public string Subject { get; set; }
    [JsonProperty("grade")]
    public string Grade { get; set; }
}

[Serializable]
public class NewModel
{
    public Student Student { get; set; }
}
然后反序列化

var result = JsonConvert.DeserializeObject<NewModel>(data);

您的JSON字符串当前表示具有名为Student的内部对象属性的对象。如果要反序列化到学生对象,JSON字符串应如下所示:

{  
   "fname":"997544",
   "lname":"997544",
   "subject":"IT",
   "grade":"F"
}
public class Wrapper
{
    public Student Student { get; set; }
}

public class Student
{
    [JsonProperty("fname")]
    public string FirstName { get; set; }
    [JsonProperty("lname")]
    public string LastName { get; set; }
    [JsonProperty("subject")]
    public string Subject { get; set; }
    [JsonProperty("grade")]
    public string Grade { get; set; }
}
var wrapper = JsonConvert.DeserializeObject<Wrapper>(data);
如果更改JSON不容易,也可以使用JObject来帮助您:

var jobject = JObject.Parse(jsonData);
var student = JsonConvert.DeserializeObject<Student>(jobject["student"].ToString());

或者正如其他人所指出的,您可以简单地创建另一个类包装器并直接反序列化到该包装器。

因为您不能更改Json字符串,所以需要修改类结构以匹配它。请注意,student对象包装在另一个类中。使用此Json数据的类结构如下所示:

{  
   "fname":"997544",
   "lname":"997544",
   "subject":"IT",
   "grade":"F"
}
public class Wrapper
{
    public Student Student { get; set; }
}

public class Student
{
    [JsonProperty("fname")]
    public string FirstName { get; set; }
    [JsonProperty("lname")]
    public string LastName { get; set; }
    [JsonProperty("subject")]
    public string Subject { get; set; }
    [JsonProperty("grade")]
    public string Grade { get; set; }
}
var wrapper = JsonConvert.DeserializeObject<Wrapper>(data);
然后像这样反序列化:

{  
   "fname":"997544",
   "lname":"997544",
   "subject":"IT",
   "grade":"F"
}
public class Wrapper
{
    public Student Student { get; set; }
}

public class Student
{
    [JsonProperty("fname")]
    public string FirstName { get; set; }
    [JsonProperty("lname")]
    public string LastName { get; set; }
    [JsonProperty("subject")]
    public string Subject { get; set; }
    [JsonProperty("grade")]
    public string Grade { get; set; }
}
var wrapper = JsonConvert.DeserializeObject<Wrapper>(data);

JSON对象位于一个无名的根/父对象中

因此,请使用以下内容

var result = JsonConvert.DeserializeObject<RootObject>(data);
我使用Json2CSharp生成额外的RootObject类

下面是所有的类定义

[Serializable]
public class Student
{
    [JsonProperty("fname")]
    public string FirstName{ get; set; }
    [JsonProperty("lname")]
    public string LastName{ get; set; }
    [JsonProperty("subject")]
    public string Subject { get; set; }
    [JsonProperty("grade")]
    public string Grade { get; set; }
 }

[Serializable]
public class RootObject
{
    public Student student { get; set; }
}

因为您试图处理JSON中的对象,所以最容易开始

var jStudent = JObject.Parse(jsonData);
然后,您可以通过键引用转到JObject的任何子属性,并按预期进行反序列化

var student = JsonConvert.DeserializeObject<Student>(jStudent["student"].ToString());

希望这能有所帮助

这不是一个有效的Json字符串,您是否缺少一个结尾}?@DavidG只是我编辑的一个键入错误it@Mostafiz,我不能以这种格式加载json,我不能change@Mostafiz既然我所有的json对象都具有相同的格式,我如何使其成为一般性的呢{或任何其他?@Mostafiz使NewModel类像公共类NewModel一样通用:其中T:class{public Student Student{get;set;}}您可以对这种情况使用匿名类型反序列化