gpt4 book ai didi

c# - 如何使用json.net(JObject/Jarray/Jtoken) 以最快的方式将class转成字典?

转载 作者:行者123 更新时间:2023-11-30 21:52:59 47 4
gpt4 key购买 nike

如何使用 json.net(JObject/Jarray/Jtoken) 并以最快(性能)的方式将类转换为字典?字典的key就是json文件中看到的“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);

???
}

最佳答案

一个简单的方法来做你想做的是使用 SelectTokens挑选出您感兴趣的 JSON 部分,然后反序列化这些位。因此:

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

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

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 });

至于哪个性能更好,您需要 test for yourself .

顺便说一句,如果您的 txt JSON 字符串来自文件并且很大,您应该考虑将其流式传输而不是将其读入中间字符串。参见 Performance Tips: Optimize Memory Usage .

关于c# - 如何使用json.net(JObject/Jarray/Jtoken) 以最快的方式将class转成字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34279454/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com