【问题标题】:Deserealization not working properly反序列化无法正常工作
【发布时间】:2015-06-24 20:26:57
【问题描述】:

我创建了一个反序列化类this JSON

public class Self
{
    public string href { get; set; }
}

public class Team
{
    public string href { get; set; }
}

public class Links
{
    public Self _self { get; set; }
    public Team team { get; set; }
}

public class Player
{
    public int id { get; set; }
    public string name { get; set; }
    public string position { get; set; }
    public int jerseyNumber { get; set; }
    public string dateOfBirth { get; set; }
    public string nationality { get; set; }
    public string contractUntil { get; set; }
    public string marketValue { get; set; }
}

public class RootObject
{
    public Links _links { get; set; }
    public int count { get; set; }
    public List<Player> players { get; set; }
}

public struct Player_Struct
{
    public string id;
    public string name;
    public string position;
    public int jerseyNumber;
    public string dateOfBirth;
    public string nationality;
    public string contractUntil;
    public string marketValue;
}

所以我做了一个函数来创建一个 HttpRequest 和相关对象:

 string requestUrl = teams.link_teams;
 string responseText = parser.Request(requestUrl);
 var obj = JsonConvert.DeserializeObject<Players.RootObject>(responseText);

现在的问题是编译器返回这个异常:

Newtonsoft.Json.dll 中未处理的异常“Newtonsoft.Json.JsonSerializationException”

后天信息:无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“SF_DebugProject.API.Players+Links”,因为该类型需要 JSON 对象(例如 {"name":"value" }) 正确反序列化。

要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化的列表。也可以将 JsonArrayAttribute 添加到类型中以强制它从 JSON 数组中反序列化。

路径“_links”,第 1 行,位置 11。

因此,通过修复提示,我尝试修复错误,将对象更改为:

List<Players.RootObject> obj = JsonConvert.DeserializeObject<List<Players.RootObject>>(responseText);

但是通过这种方式,当我执行 foreach 时,我看不到 rootobject 的任何属性。我做错了什么?

【问题讨论】:

  • json 在哪里?消息说输入形状与目标类型不匹配。反序列化不能改变数据的形状。如果您的输入包含没有其他数据的玩家数组,则不能强制它成为RootObject
  • json 在这里:api.football-data.org/alpha/teams/19/players 无论如何,有了这个对象我可以看到 RootObject 的参数: var obj = JsonConvert.DeserializeObject(responseText);但由于奇怪的原因返回了异常。

标签: c# json


【解决方案1】:

据我了解,您想反序列化包含玩家列表的 RootObject 中的 JSON 字符串。

类应该是这样的:

public class Rootobject
{
    public _Links _links { get; set; }
    public int count { get; set; }
    public Player[] players { get; set; }
}

public class _Links
{
    public _Self _self { get; set; }
    public Team team { get; set; }
}

public class _Self
{
    public string href { get; set; }
}

public class Team
{
    public string href { get; set; }
}

public class Player
{
    public int id { get; set; }
    public string name { get; set; }
    public string position { get; set; }
    public int jerseyNumber { get; set; }
    public string dateOfBirth { get; set; }
    public string nationality { get; set; }
    public string contractUntil { get; set; }
    public string marketValue { get; set; }
}

所以你应该做如下的事情:

var obj = JsonConvert.DeserializeObject<RootObject>(response);
foreach(var player in obj.players) 
{
     // some stuff
}

【讨论】:

  • 他就是这么做的
  • 事实上我已经这样做了。我的问题是我看不到每个玩家的参数。参数是包含在 Player 类中的参数。参考第一个 obj 而不是我可以看到参数(变量),关键是在函数执行期间我得到了一个异常。
  • 好的,我编辑了答案以显示要使用的 C# 类。
  • 无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“SF_DebugProject.API.Players+_Links”,因为该类型需要 JSON 对象(例如 {"name":" value"}) 以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如 List 可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中,以强制它从 JSON 数组中反序列化。
  • 我在我的机器上试过了,它可以工作。你确定你传递给 JsonConvert 的 JSON 字符串没问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2016-05-24
相关资源
最近更新 更多