2015-12-15 69 views
2

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

回答

2

一個簡單的方法來做你想做的就是用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

相關問題