【问题标题】:JSON.Net Deserialization of non-generic Root Objects非通用根对象的 JSON.Net 反序列化
【发布时间】:2015-12-17 06:28:52
【问题描述】:

我目前正在做一个项目,我向 Riot Games API 发出请求,解析 JSON,并用它做一些事情。我有请求工作,我知道我得到了有效的 JSON。我的问题是使用 JSON.Net 反序列化 JSON。

JSON 的结构如下:

{
  "xarcies": {
        "id": 31933985,
        "name": "Farces",
        "profileIconId": 588,
        "revisionDate": 1450249383000,
        "summonerLevel": 30
    }
}

我想把这些数据加载到下面的类中

[JsonObject(MemberSerialization.OptIn)]
class Summoner
{
    [JsonProperty("id")]
    public long id {get;set;}

    [JsonProperty("name")]
    public string name { get; set; }

    [JsonProperty("profileIconId")]
    public int profileIconId { get; set; }

    [JsonProperty("revisionDate")]
    public long revisionDate { get; set; }

    [JsonProperty("summonerLevel")]
    public long summonerLevel { get; set; }
}

我遇到的问题是,因为我得到了一个包含我需要的信息的“xarcies”对象,所以我不确定如何设计一个可以接受 JSON 数据的类。我见过一些使用 RootObject 类来获取对象的示例,并且该类有一个所有对都放入的子类,但我似乎无法让它工作。每次我运行它时,对象的属性最终都是 NULL。

【问题讨论】:

  • "xarcies" 是标准属性名称,还是特定召唤师的名称?
  • farces 是特定召唤师的名字。每次返回 JSON 时,api 都会以这种方式吐出。

标签: c# json json.net riot-games-api


【解决方案1】:

您可以将您的 JSON 反序列化为 Dictionary<string, Summoner>:

var root = JsonConvert.DeserializeObject<Dictionary<string, Summoner>>(jsonString);

字典将以用户名作为关键字,在本例中为"xarcies"。见Deserialize a Dictionary

【讨论】:

  • 你也是给我指出这个方向的 Redditor 吗?无论如何,这绝对是我一直在寻找的答案。
【解决方案2】:

我刚刚使用json2csharp 创建了以下类(它的类型看起来和你的有点不同):

public class UserData
{
    public int id { get; set; }
    public string name { get; set; }
    public int profileIconId { get; set; }
    public long revisionDate { get; set; }
    public int summonerLevel { get; set; }
}

public class RootObject
{
    public KeyValuePair<string, UserData> value { get; set; }
}

【讨论】:

  • 好的。这将有助于类本身的结构。也不知道json2csharp。漂亮的工具。然而,我还有一个挥之不去的问题。这适用于这个特定的对象。但是,xarcies 是用户。这意味着根据我从 API 请求的用户,类结构会发生变化。有没有通用的方法来解决这个问题?
  • @Jatrammel 你能试试上面的方法吗?
  • 刚试过。 value.Keyvalue.Value 都返回为 null
  • @dbc 抱歉,只是在一个不同的问题上阅读它......也许Summoner 效果更好(不是更好 - 它有效)。但我不能从你那里复制粘贴,不是吗?....
  • Json.NET 不会将单个键/值对序列化为字典,它会像这样序列化它:{"value":{"Key":"xarcies","Value":{"id":31933985,"name":"Farces","profileIconId":588,"revisionDate":1450249383000,"summonerLevel":30}}}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多