2017-09-22 36 views
1

我有字符串鍵值字典字典的JSON。有他的結構如下:如何使用JSON.net反序列化複雜的JSON c#

{ 
"NameA":{ 
    "ParametersA":[ 
     [104.3,5.368783], 
     [104.212,2.57357],..., 
    ], 
    "ParametersB":[ 
     [104.3,5.368783], 
     [104.212,2.57357],..., 
    ] 
}, 
"NameB":{ 
    "ParametersA":[ 
     [104.3,5.368783], 
     [104.212,2.57357],..., 
    ], 
    "ParametersB":[ 
     [104.3,5.368783], 
     [104.212,2.57357],..., 
     ] 
    }, 
"ThousandsNamesN":{[...] 
    } 
} 

我爲此創建類來獲得這樣的數據:Dictionaty<key=NameA, value=List<Parameters>>和參數是另一個類到數組A和B.

這是我的根類:

internal class RawDepth 
{ 
    public Dictionary<string, Parameters> Names { get; set; } 

    internal class Parameters 
    { 
     [JsonProperty("ParametersA")] 
     public IList<Orders> A { get; set; } 


     [JsonProperty("ParametersB")] 
     public IList<ParamsArray> B { get; set; } 
    } 

    internal class ParamsArray 
    { 
     public decimal[,] _Orders { get; set; } 
    } 
} 

我捕捉到一個空引用異常。我嘗試了不同的方式創建類,但我仍然無法對它進行反序列化。我做錯了什麼?

+0

分開你的課程。 – Kixoka

回答

1

您的模型可以簡單地這樣的事情

public class Parameters 
{ 
    public List<List<decimal>> ParametersA { get; set; } 
    public List<List<decimal>> ParametersB { get; set; } 
} 

現在你可以反序列化作爲

var dict = JsonConvert.DeserializeObject<Dictionary<string, Parameters>>(json); 
+1

謝謝,它的工作! –

1

有一個偉大的工具json2csharp,它可以讓你粘貼JSON,並從它生成C#類。這就是我從你的樣本中得到的結果:

public class NameA 
{ 
    public List<List<double>> ParametersA { get; set; } 
    public List<List<double>> ParametersB { get; set; } 
} 

public class NameB 
{ 
    public List<List<double>> ParametersA { get; set; } 
    public List<List<double>> ParametersB { get; set; } 
} 

public class RootObject 
{ 
    public NameA NameA { get; set; } 
    public NameB NameB { get; set; } 
    public List<string> ThousandsNamesN { get; set; } 
} 

我想我們可以放心地假設NameA和NameB類是相同的。

我不得不編輯JSON一點FOT它的工作,所以我將它粘貼在下面:

{ 
"NameA":{ 
    "ParametersA":[ 
     [104.3,5.368783], 
     [104.212,2.57357], 
    ], 
    "ParametersB":[ 
     [104.3,5.368783], 
     [104.212,2.57357], 
    ] 
}, 
"NameB":{ 
    "ParametersA":[ 
     [104.3,5.368783], 
     [104.212,2.57357], 
    ], 
    "ParametersB":[ 
     [104.3,5.368783], 
     [104.212,2.57357], 
     ] 
    }, 
"ThousandsNamesN":["name1", "name2"] 

} 

所以考慮到什麼是你initail的想法後,你的代碼應該看起來像:

public class Order 
{ 
    public List<List<double>> ParametersA { get; set; } 
    public List<List<double>> ParametersB { get; set; } 
} 

var obj = JsonConvert.DeserializeObject<Dictionary<string, Order>>(json); 
+0

我知道,使用相同的服務。但是,我擁有數千個密鑰NameA,NameB,... NameN,其中N可以是3000-4000。早期我反序列化相同的JSON到字典,其中NameA..N在另一個對象,但在這個JSON我有麻煩... –

+0

我編輯了我的答案。你的根對象是一本字典 –

+0

謝謝!是工作! –