C# 反序列化json对象不起作用
我想将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
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;}}您可以对这种情况使用匿名类型反序列化