【问题标题】:JsonConvert.Deserialize not recognizing arrayJsonConvert.Deserialize 无法识别数组
【发布时间】:2015-12-09 15:49:26
【问题描述】:

我对这个有点难过。我所做的一切检查都表明它是一个有效的 Json 数组,但 JsonConvert.Deserialize 说它是一个对象。有人能指出我做错了什么吗?

要复制的代码:

var data = "[{\"User\": {\"Identifier\": \"24233\",\"DisplayName\": \"Commerce Test Student\",\"EmailAddress\": \"email@email.ca\",\"OrgDefinedId\": \"UniqueId1\",\"ProfileBadgeUrl\": null,\"ProfileIdentifier\": \"zzz123\"},\"Role\": {\"Id\": 153,\"Code\": null,\"Name\": \"Commerce Student\"}}]";

var items = JsonConvert.DeserializeObject<List<T>>(data);

其中 T 是符合以下格式的对象:

public class OrgUnitUser
{
    public User User { get; set; }
    public RoleInfo Role { get; set; }
}

public class User
{
    public string Identifier { get; set; }
    public string DisplayName { get; set; }
    public string EmailAddress { get; set; }
    public string OrgDefinedId { get; set; }
    public string ProfileBadgeUrl { get; set; }
    public string ProfileIdentifier { get; set; }
}
public class RoleInfo
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

导致错误

Newtonsoft.Json.JsonSerializationException:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[CoverPages.Models.D2L.OrgUnitUser]”,因为该类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。

感谢任何/所有帮助!

【问题讨论】:

  • 尝试删除外部方括号[]
  • 删除括号会导致同样的错误。奇怪的是,如果我复制数据变量 Javascript 并对其进行 JSON.parse,它会成功创建一个 javascript 对象数组...

标签: c# json json.net json-deserialization


【解决方案1】:
var data = "[{\"User\": {\"Identifier\": \"24233\",\"DisplayName\": \"Commerce Test Student\",\"EmailAddress\": \"email@email.ca\",\"OrgDefinedId\": \"UniqueId1\",\"ProfileBadgeUrl\": null,\"ProfileIdentifier\": \"zzz123\"},\"Role\": {\"Id\": 153,\"Code\": null,\"Name\": \"Commerce Student\"}}]";

public class User
{
    public string Identifier { get; set; }
    public string DisplayName { get; set; }
    public string EmailAddress { get; set; }
    public string OrgDefinedId { get; set; }
    public object ProfileBadgeUrl { get; set; }
    public string ProfileIdentifier { get; set; }
}

public class Role
{
    public int Id { get; set; }
    public object Code { get; set; }
    public string Name { get; set; }
}

public class RootObject
{
    public User User { get; set; }
    public Role Role { get; set; }
}

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

var items = JsonConvert.DeserializeObject<List<RootObject>>(data)[0];

试试这个代码,我认为他工作得很好

结果:

【讨论】:

  • 看起来您所做的只是将 Role.Code 更改为对象,将 User.ProfileBadgeUrl 更改为对象,对吗?如果是这样,那没有任何区别,我得到同样的错误。
  • 我正在用结果更新答案。
  • 嗯。您所做的任何更改似乎都没有任何效果,因为传递的值是字符串,因此将其设置为 object 似乎没有效果。但是,似乎问题出在泛型上。如果我将 List 更改为 List 则反序列化成功。
  • 我不确定您的评论是什么意思。我正在使用 DeserializeObject,但是将对象的数据类型从字符串转换为对象并没有完成任何事情,因为传递的数据是字符串,并且无需修改即可绑定。
【解决方案2】:

感谢 Taras 的确认,但代码本身没有问题。

在 JsonConver.Deserialize 中使用泛型时,会出现我上面列出的错误,但是将 OrgUnitUser 的实际类型放入列表中,而不是 T 会导致转换成功。

修改代码

var items = JsonConvert.DeserializeObject<List<T>>(data);

var items = JsonConvert.DeserializeObject<List<OrgUnitUser>>(data);

修复了问题

【讨论】:

  • 这不是答案,应该只是对您的问题的评论或对您问题的编辑
  • 对不起,我是新手,怎么不是答案?问题是 Newtonsoft 在我使用解决方案的情况下不处理泛型,您不能使用泛型。或者,如果我从 newtonsoft 得到官方消息说这是一个已知故障,它是否只能被标记为答案?我认为这是一个答案,因为上面的帖子将自己列为答案,实际上并没有解决任何问题。我认为我的答案更像是一个答案,因为我给出了我的代码无法正常工作的原因以及我是如何解决这个问题的。
  • @TravisSmith 如果它是您原始问题的解决方案(看起来就是这样,现在您已经对其进行了编辑),那么它就有资格作为答案。
  • 谢谢布赖恩,是的,我想也许我没有提供足够的细节来说明我做了什么以使其成为“答案”,所以我添加了更多细节。
  • 这个编辑后的版本更清楚地表明这是一个实际的答案,所以你可以忽略我之前的评论。另外,我要对 Taras 的答案进行投票,因为它可以帮助您获得答案,而且我发现您还不能投票
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2016-06-02
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多