如何使用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);
???
}
一种简单的方法是使用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的示例。