如何反序列化 JSON 数组并忽略根节点?

Posted

技术标签:

【中文标题】如何反序列化 JSON 数组并忽略根节点?【英文标题】:How do I deserialize a JSON array and ignore the root node? 【发布时间】:2014-01-24 01:52:24 【问题描述】:

我有来自服务器的下一个响应 -

"response":["uid":174952xxxx,"first_name":"xxxx","last_name":"xxx"]

我正在尝试以另一种方式反序列化 -

JsonConvert.DeserializeObject<T>(json);  

其中 T = VkUser 列表,但出现错误。

[JsonObject]
public class VkUser

    [JsonProperty("uid")]
    public string UserId  get; set; 

    [JsonProperty("first_name")]
    public string FirstName  get; set; 

    [JsonProperty("last_name")]
    public string LastName  get; set; 

我一直在尝试

public class SomeDto // maybe Response as class name will fix it but I don't want such name

    public List<VkUser> Users get;set;

哪些反序列化选项可以帮助我?

【问题讨论】:

无法将当前 JSON 对象(例如 "name":"value")反序列化为类型 'System.Collections.Generic.List`1[Oauth.Vk.Dto.VkUserApi.VkUser]'因为该类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或 List)。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。 【参考方案1】:

使用SelectToken:

string s =  "\"response\":[\"uid\":174952,\"first_name\":\"xxxx\",\"last_name\":\"xxx\"]";

var users = JObject.Parse(s).SelectToken("response").ToString();

var vkUsers = JsonConvert.DeserializeObject<List<VkUser>>(users);

正如 Brian Rogers 所指出的,您可以直接使用ToObject

var vkUsers = JObject.Parse(s).SelectToken("response").ToObject<List<VkUser>>();

【讨论】:

与其将选中的token转回字符串再重新解析,不如使用ToObject&lt;List&lt;VkUser&gt;&gt;()直接将选中的token转换成最终结果。 您的回答会产生错误。如果您的数据仅包含一个结果,则它会生成错误,因为它不是对象数组,而是单个对象

以上是关于如何反序列化 JSON 数组并忽略根节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何反序列化xml文件的子节点

使用C# json 二维数组 反序列化

如何忽略像“car”这样的空 json 对象:,这会在使用 jackson 反序列化后导致空 pojos

将 JSON 数组反序列化为 List<T> C# 时出错

XML 反序列化忽略不按字母顺序排列的属性

使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性