如何使用json.net(JObject/Jarray/Jtoken),并以最快的方式将其转换为类,转换为字典

本文关键字:转换 方式 字典 net json 何使用 JObject Jarray Jtoken | 更新日期: 2023-09-27 18:26:44

如何使用json.net(JObject/Jarray/Jtoken)并以最快(性能)的方式将其转换为类,以生成字典?字典的关键字是json文件中的sees"name"

有人能帮忙吗?

非常感谢!

seed.json
       {
          "Seed": [
                {
                    "name": "Cheetone",
                    "growthrate": 1,
                    "cost": 500
                },
                {
                    "name": "Tortone",
                    "growthrate": 8,
                    "cost": 100
                }
            ],
        }

    public class SoilStat
    {
        public int growthRate;
        public int cost;
    }
    public class DataLoader : MonoSingleton<DataLoader>
    {
        public string txt;
        Dictionary<string, SoilStat> _soilList = new Dictionary<string, SoilStat>();
        JObject rawJson = JObject.Parse(txt);
        ???
    }

如何使用json.net(JObject/Jarray/Jtoken),并以最快的方式将其转换为类,转换为字典

一种简单的方法是使用SelectTokens来挑选您感兴趣的JSON部分,然后对这些位进行反序列化。因此:

        var rawJson = JObject.Parse(txt);
        var _soilList = rawJson.SelectTokens("Seed[*]").ToDictionary(t => t["name"], t => t.ToObject<SoilStat>());

一个更复杂的解决方案是创建用于反序列化的DTO对象,然后将它们映射到您想要的类:

public class NamedSoilStat : SoilStat
{
    public string name { get; set; }
}
public class RootObject
{
    public RootObject() { this.Seed = new List<NamedSoilStat>(); }
    public List<NamedSoilStat> Seed { get; set; }
}

然后:

        var root = JsonConvert.DeserializeObject<RootObject>(txt);
        var _soilList = root.Seed.ToDictionary(t => t.name, t => new SoilStat { cost = t.cost, growthRate = t.growthRate });

至于哪一个更具表演性,你需要自己测试一下。

顺便说一句,如果txt JSON字符串来自一个文件,并且很大,则应该考虑将其流式传输,而不是将其读取到中间字符串中。请参阅性能提示:优化内存使用情况。

根据我的经验,使用JsonConvert要比使用JObject.Parse()快得多。请参阅此页面以获取性能比较(在Windows Phone上,但我想在桌面上会类似),从该页面链接的是一个使用JsonConvert的示例。