2017-09-22 60 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

谢谢!是工作! –