如何使用JSON.net c#反序列化复杂的JSON

时间:2017-09-22 16:24:09

标签: c# json json.net deserialization

我有带有值数组的字符串键的JSON。他的结构如下:

{
"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的类。

这是我的Root类:

    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; }
    }
}

我捕获了一个空引用异常。我尝试用不同的方式创建类,但我仍然无法对其进行反序列化。我做错了什么?

2 个答案:

答案 0 :(得分: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才能正常工作,所以我会将其粘贴到下面:

    {
"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"]

}

因此,在考虑了您的初始想法之后,您的代码应如下所示:

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);

答案 1 :(得分: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);