如何使用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); 

     ??? 
    } 
+0

什么是_txtAsset?顶部是JSON的片段吗?如果是这样,你能否提供你正在使用的实际有效的JSON? (因为它是畸形的) –

+0

你的问题听起来很一般,但你展示的实际代码似乎并非如此。字典键应该是什么? – dbc

+0

已更新代码@dbc – phongyewtong

在我的经验,使用JsonConvert比使用JObject.Parse()显著更快。请参阅this page for a performance comparison(在Windows Phone上,但我认为它在桌面上会类似),并且从该页面链接到an example that uses JsonConvert

+0

谢谢,但我如何使用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

+0

由于unity5的限制,我不能使用selecttoken。有没有其他的方式来做到这一点,而不创建DTO对象? @dbc – phongyewtong