【问题标题】:Json is not deserializing correctly into a classJson 没有正确反序列化为一个类
【发布时间】:2019-01-29 16:21:29
【问题描述】:

我正在尝试将数组转换为类。所以我得到了数组,然后用 JsonConvert 对其进行序列化,如下所示:

var gameResponse = GetGame(Id);
var returnedArray = gameResponse.Result.Results;
var json = JsonConvert.SerializeObject(returnedArray);
var result = JsonConvert.DeserializeObject<T>(json);

我可以在 Visual Studio 调试模式下看到这个结果,“json”看起来像这样:

[
  { 
    \"CreatorId\":\"41c5321e-6f37-4d4f-92f7-fc381be0fc62\",
    \"GameId\": \"3938\",
    \"Type\": \"2\",
    \"CreateDate\": \"1/2/2017\",
    \"TeamId\": \"2394\",
    \"LeaderId\": \"34922\",
    \"CountryCode\": \"23\",
    \"SalesRank\": \"4\",
    \"Title\": \"Space Shooter Max\",
    \"TeamName\": \"The One\",
    \"TeamMembers\" : \"4\"
  }
]

但是,当代码到达下一行时:

var result = JsonConvert.DeserializeObject<T>(json);  // In this case, <T> is <Game>

我收到此错误:

JsonSerializationException: 无法反序列化当前 JSON 数组 (例如 [1,2,3])进入类型“GameLabs.Game”,因为该类型需要 正确反序列化的 JSON 对象(例如 {"name":"value"})。

GameLabs.Game 是一个如下所示的类:

public sealed class Game
{
    public string CreatorId { get; set; }
    public string GameId { get; set; }
    public string Title { get; set; }
    public DateTime CreateDate { get; set; }
    public string CountryCode { get; set; }
}

我不确定它为什么不接受 JSON。

有人发现有什么不对吗?

谢谢!

【问题讨论】:

  • 在 DeserializeObject 中需要将 Game[] 或 List 作为 T 传递,

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


【解决方案1】:

如果您检查 JSON,它不是单个对象,而是一个集合。 “[..]”表示一个集合。

例如,

[ "Ford", "BMW", "Fiat" ] 

上面的 Json 暗示了一个包含 3 个元素的字符串数组。这也类似于您的 Json。

因此,您还需要将 Json 反序列化为 Collection。

var result = JsonConvert.DeserializeObject<List<T>>(str);

你可以阅读更多关于 Json Arrays here

【讨论】:

    【解决方案2】:

    如我所见,你的 JSON 是数组,你应该这样写:

    var result = JsonConvert.DeserializeObject<T[]>(json);
    

    T=>T[]

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2019-05-02
      相关资源
      最近更新 更多