0

我正在尝试反序列化从 LinkedIn Javascript API 获得的 Json 对象:

{"_key":"~","educations":{"_total":2,"values":[{"degree":"Bachelor of Science (BSc)","endDate":{"year":2004},
"fieldOfStudy":"Computer Software Engineering","id":134450447,"schoolName":"Bristol University","
startDate":{"year":2009}},{"id":143651018,"schoolName":"University of Kingston"}]},"emailAddress":
"test@test.com","firstName":"Robert","lastName":"Matthews"}

我编写了一个自定义类来存储这些值并使用 Json.NET 反序列化它们:

[Serializable]
  public class LinkedInUserData {

    [JsonProperty(PropertyName = "emailAddress")]
    public string EmailAddress { get; set; }

    // other properties cut out for simplicity

    [JsonProperty(PropertyName = "educations")]
    public Educations Educations { get; set; }
  }

  [Serializable]
  public class Educations {

   [JsonProperty(PropertyName = "_total")]
   public string Total { get; set; }

   [JsonProperty(PropertyName = "values")]
   public Values Values { get; set; }
  }

  [Serializable]
  public class Values { // cut down for simplicity

    [JsonProperty(PropertyName = "degree")]
    public string Degree { get; set; }

  }

 LinkedInUserData linkedData = JsonConvert.DeserializeObject<LinkedInUserData>(profile);

我能够毫无问题地转换单个对象(无数组等),但我卡在 Educations 中的 Values 对象上,并显示以下错误消息:

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“Data.Values”,因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。路径“educations.values”,第 1 行,位置 47。

我尝试将 Educations 中的 Values 对象更改为字符串数组,但没有成功。有什么方法可以成功地将 Json 中的值反序列化到我的自定义类中,还是只能按照字符串数组的方式获得一些东西?

编辑- 列表(值)产品出现以下错误:

读取字符串时出错。意外标记:StartObject。路径 'educations.values[0].endDate',第 1 行,位置 96。

编辑 2 - 好的,我现在明白了,(值的)列表确实有效,然后它在 StartDate 和 EndDate 上跳闸,因为它们本身就是对象,我将它们都设置为strings. 我一直在努力理解Json字符串,但Link2CSharp帮助我解决了它。

4

1 回答 1

3

我相信你需要根据 json 重构你的类。您可以尝试使用json2csharp 针对 Json 生成 C# 类(如果您想针对 json 自动创建 C# 类,这是一个非常好的资源)。以下是它给出的结构。您可以将它与 JSON.Net 一起使用来获取对象。

public class EndDate
{
    public int year { get; set; }
}

public class StartDate
{
    public int year { get; set; }
}

public class Value
{
    public string degree { get; set; }
    public EndDate endDate { get; set; }
    public string fieldOfStudy { get; set; }
    public int id { get; set; }
    public string schoolName { get; set; }
    public StartDate __invalid_name__
startDate { get; set; }
}

public class Educations
{
    public int _total { get; set; }
    public List<Value> values { get; set; }
}

public class RootObject
{
    public string _key { get; set; }
    public Educations educations { get; set; }
    public string emailAddress { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
}
于 2012-11-29T11:00:13.793 回答