【问题标题】:Trouble Deserializing JSON Dictionaries in a huge complex data file在庞大的复杂数据文件中反序列化 JSON 字典时遇到问题
【发布时间】:2021-07-22 17:10:38
【问题描述】:

在一个消耗大量 api 数据的 C# 应用程序上工作,到目前为止我还没有遇到过关于数据反序列化的问题。

我有一个 200k+ 行的 json 文件,它是 90% 反序列化的

Json 是这样的

{
 "missionRewards": { //[This needs to be the first dictionary<string, Planet> (see code below)]
    "planet_name" : { //[This needs to be the second dictionary<string, Mission> (see code below)]
      "mission_name": {
        everything within the mission object is interpreted correctly, it contains 2 strings and 3 arrays of reward.
      }
    }
  }
}

行星名称和任务名称是字典键,因为在实际的 json 文件中它们都有唯一的名称。 “地球、火星、金星等”

实际的 json 文件可以在这里找到。

http://drops.warframestat.us/data/all.json

这是我的反序列化类的重要部分

public class A
    {
        [JsonProperty("_id")]
        public string Id;

        [JsonProperty("itemName")]
        public string ItemName;

        [JsonProperty("rarity")]
        public string Rarity;

        [JsonProperty("chance")]
        public double Chance;

        [JsonProperty("stage")]
        public string Stage;
    }

    public class B
    {
        [JsonProperty("_id")]
        public string Id;

        [JsonProperty("itemName")]
        public string ItemName;

        [JsonProperty("rarity")]
        public string Rarity;

        [JsonProperty("chance")]
        public double Chance;

        [JsonProperty("stage")]
        public string Stage;
    }

    public class C
    {
        [JsonProperty("_id")]
        public string Id;

        [JsonProperty("itemName")]
        public string ItemName;

        [JsonProperty("rarity")]
        public string Rarity;

        [JsonProperty("chance")]
        public double Chance;

        [JsonProperty("stage")]
        public string Stage;
    }

    public class Rewards
    {
        [JsonProperty("A")]
        public List<A> A;

        [JsonProperty("B")]
        public List<B> B;

        [JsonProperty("C")]
        public List<C> C;

        [JsonProperty("_id")]
        public string Id;

        [JsonProperty("itemName")]
        public string ItemName;

        [JsonProperty("rarity")]
        public string Rarity;

        [JsonProperty("chance")]
        public double Chance;

        [JsonProperty("rotation")]
        public string Rotation;
    }

    public class Mission
    {
        [JsonProperty("gameMode")]
        public string GameMode;

        [JsonProperty("isEvent")]
        public bool IsEvent;

        [JsonProperty("rewards")]
        public Rewards Rewards;
    }

    public class Planet
    {
        public Dictionary<string, Mission> Missions;
    }

    public class MissionRewards
    {
        public Dictionary<string, Planet> Planets;
    }

到目前为止,我尝试在字典上声明一个 [JsonDictionary] 参数,并尝试使用对象列表、无类型对象字典,但我似乎无法工作,因为 json 反序列化程序无法识别任何一个对象作为字典。

我正在使用 Newtonsoft.JSON 进行操作。

关于如何解决我发现自己的情况的任何指示。基本上,我主要关心的是在对象被反序列化后将标识名称绑定到对象,而我不能使用列表来做到这一点。

【问题讨论】:

  • 这是 json 类转换创建它的方式,但正如您所见,每个任务都被单独声明为自己的对象,这就是我宁愿拥有字典的原因。 pastebin.com/0KXLq3Bs

标签: c# json dictionary json.net


【解决方案1】:

如果你创建了这个类型

public class WarframeStats{
    public Dictionary<string, Dictionary<string, Mission>> MissionRewards;
}

JsonConvert.DeserializeObject&lt;WarframeStats&gt;(jsonString);

您会将解析后的 JSON 作为嵌套字典。在您的原始帖子中,它没有像您预期的那样反序列化,因为没有名为“Missions”或“Planets”的属性。JSONConvert 不知道为这些变量分配什么。可能有一些方法可以将其分配给他们,但可能必须为此查阅官方文档。

【讨论】:

  • 我理解由于未命名的类型而没有反序列化它的原因,我希望这里有人以前曾处理过这样的问题,因为我无法在文档上找到信息.最好将 JsonProperty 之类的东西与字符串数组一起使用,这样实现起来也不会太糟糕。
  • 一种方法是使用 JObject 手动解析。您遍历每个节点并随时创建相应的 DTO。
  • 无论如何在解决它之后我遇到了第二个问题,我知道我需要做什么才能让它工作我只是无法弄清楚 JsonConverter 库,问题是任务可以有对象奖励或者一个奖励数组,它与奖励相同,只是没有 a、b、c 列表,如果你愿意,我可以提出一个单独的问题。我正在尝试为文件的奖励部分编写 json 转换抽象类,但有一个偷偷摸摸的怀疑我需要在自定义转换器中构建整个文件。
  • 我通过将任务更改为对象然后在读取数据时将其转换为 for 循环来解决第二个问题。目前速度较慢,但​​有效,接下来会提高效率。
【解决方案2】:

尝试这样做:

让 Planet 成为字典的子类,而不是包含字典的 Planet。

public class Root {
    public Dictionary<string, Planet> MissionRewards { get; set; }
}

public class Planet : Dictionary<string, Mission> {

}

public class Mission: Dictionary<string, object> {

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多