反序列化json对象不起作用

时间:2016-08-22 16:41:57

标签: c# json deserialization

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

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

我的json数据

{  
"student":{  
  "fname":"997544",
  "lname":"997544",
  "subject":"IT",
  "grade":"F"
}
}

我的学生班

[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])才能正确反序列化。

5 个答案:

答案 0 :(得分:5)

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

Manifest.xml

如果更改你的JSON并不容易,你也可以使用JObject来帮助你这样做:

{  
   "fname":"997544",
   "lname":"997544",
   "subject":"IT",
   "grade":"F"
}

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

答案 1 :(得分:2)

因为你试图从JSON处理对象,所以最简单的方法是从

开始
var jStudent = JObject.Parse(jsonData);

然后,您可以通过键引用转到JObject的任何子属性,并按预期反序列化。

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

希望有所帮助

答案 2 :(得分:1)

如果你必须使用你下载的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);

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您的JSON对象位于无名 Root / Parent 对象中。

所以请使用以下内容。

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

然后您的Student实例可以result.student

进行访问

例如:

string firstName = result.student.FirstName; 

我使用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; }
}