【问题标题】:Deserialize JSON array into C# Structure with RestSharp使用 RestSharp 将 JSON 数组反序列化为 C# 结构
【发布时间】:2017-11-22 08:06:11
【问题描述】:

我正在使用 RestSharp 和 IRestResponse<T> response = client.Execute<T>(request) 将不同的 JSON 结构动态地转换为各种 C# 结构。但是,一个特殊的 JSON 结果给我带来了麻烦,它以括号开头和结尾...

我的 JSON 以“[”和“]”字符开头和结尾:

[
  {
    "first": "Adam",
    "last": "Buzzo"
  },
  {
    "first": "Jeffrey",
    "last": "Mosier"
  }
]

我已经创建了这个类结构:

public class Person
{
    public string first { get; set; }
    public string last { get; set; }
}
public class Persons
{
    public List<Person> person { get; set; }
}

我在一个方法中使用 RestSharp 动态反序列化为我的 Persons 类型 T...

IRestResponse<T> response = client.Execute<T>(request);
return response;

问题是当 T 是 Persons 我在客户端收到此错误。执行行:

无法将“RestSharp.JsonArray”类型的对象转换为“System.Collections.Generic.IDictionary`2[System.String,System.Object]”类型。

我也尝试过使用 Json.Net 并收到此错误:

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

鉴于最初的“[”字符,我尝试反序列化为 PersonsList。这停止了​​错误消息,我有正确数量的“人员”记录,但它们都是空的。 (我确认名称的大小写是相同的。)我也不想使用 List 集合,因为目标服务器的数组中始终只有一个元素,因此绑定到“Persons”比“List”更有意义.

将此 JSON 反序列化为 Persons 并且仍在我的动态 IRestResponse&lt;T&gt; response = client.Execute&lt;T&gt;(request) 方法范围内的正确方法是什么?

【问题讨论】:

  • 我认为你应该直接反序列化为 List 而不是 Persons 对象。因为反序列化程序会尝试查找原始 JSON 示例中不存在的名为“person”的属性。
  • 帮了大忙,罗伯托!我错过了一个事实,即使我的外部列表类仍然需要 JSON 中的名称。

标签: c# json deserialization restsharp json-deserialization


【解决方案1】:

如 cmets 中所述,您的 json 包含一组人员。因此,要反序列化的目标结构应该与之匹配。 要么使用:

var response = client.Execute<List<Person>>(request);

或者如果您更喜欢 Persons 类,请将其更改为

public class Persons : List<Person>
{
}

【讨论】:

  • 感谢您和罗伯托。您避免在外部类中具有命名成员的类继承想法很棒......因为我的 JSON 没有命名外部结构。它奏效了。
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
相关资源
最近更新 更多