如何使用json.net(JObject/Jarray/Jtoken)并以最快的方式将其转换为字典?
如何使用json.net(JObject/Jarray/Jtoken)并以最快(性能)的方式将类转换为字典?字典的关键是在json文件中看到“名称”如何使用json.net(JObject/Jarray/Jtoken)并以最快的方式将其转换为字典?
任何人都可以帮忙吗?
非常感谢!
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);
???
}
在我的经验,使用JsonConvert
比使用JObject.Parse()
显著更快。请参阅this page for a performance comparison(在Windows Phone上,但我认为它在桌面上会类似),并且从该页面链接到an example that uses JsonConvert。
谢谢,但我如何使用JsonConvert.DeserializeObject到种子“名称”作为关键字的字典? – phongyewtong
一个简单的方法来做你想做的就是用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。顺便说一句,如果你的 JSON字符串来自一个文件,并且很大,你应该考虑将它串流化,而不是将它读入中间字符串。请参阅Performance Tips: Optimize Memory Usage。
由于unity5的限制,我不能使用selecttoken。有没有其他的方式来做到这一点,而不创建DTO对象? @dbc – phongyewtong
什么是_txtAsset?顶部是JSON的片段吗?如果是这样,你能否提供你正在使用的实际有效的JSON? (因为它是畸形的) –
你的问题听起来很一般,但你展示的实际代码似乎并非如此。字典键应该是什么? – dbc
已更新代码@dbc – phongyewtong