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

25
我收到了来自服务器的下一个响应 -
{"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类型(例如不是像整数这样的基元类型,也不是像数组或List<T>这样的集合类型),可以从JSON对象反序列化。还可以向类型添加JsonObjectAttribute以强制它从JSON对象反序列化。 - tony
1个回答

55
使用 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>>();

11
不必将选定的标记转换回字符串再重新解析它,直接使用ToObject<List<VkUser>>()将所选的标记直接转换为最终结果会更好。 - Brian Rogers
您的答案生成错误。如果您的数据只包含一个结果,则会生成错误,因为它不是对象数组,而是单个对象。 - Lalji Dhameliya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接