如何反序列化JSON

时间:2016-04-20 17:56:43

标签: c# arrays json string

我有一个像这样的JSON字符串:

[{"633" : [{"8768" : "hello","8769" : "world"}],"634" : [{"8782" : "on","8783" : "No"}]}]

我正在尝试反序列化/解析此字符串。

这是我到目前为止所做的:

var arrString = "[{\"633\" : [{\"8768\" : \"hello\",\"8769\" : \"world\"}],\"634\" : [{\"8782\" : \"on\",\"8783\" : \"No\"}]}]"

var attendeeArray = JsonConvert.DeserializeObject<List<Dictionary<int, string>>>(arrString); //error

这给了我错误:附加信息:解析值时遇到意外的字符:[。路径'[0] .633',第1行,第11位。

我想知道是不是因为我正在使用int, string,它应该是int, array (int, string)

更多信息

这是关于我之前回答的问题: How to get the values and keys from a json deserialized/parsed string in C#?

但现在我需要数组内的数组。

2 个答案:

答案 0 :(得分:2)

在这种情况下,键/值对象实际上包装在数组中。这可以反序列化为类型optional func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) ,如下所示:

List<Dictionary<int, List<Dictionary<int, string>>>>

结构基本上是:

var arrString = "[{\"633\" : [{\"8768\" : \"hello\",\"8769\" : \"world\"}],\"634\" : [{\"8782\" : \"on\",\"8783\" : \"No\"}]}]";
var attendeeArray = JsonConvert.DeserializeObject<List<Dictionary<int, List<Dictionary<int, string>>>>>(arrString);

答案 1 :(得分:1)

可能值得重新考虑您的JSON架构,但如果您想要走这条路线,那么您可以通过以下方式遍历JSON:

dynamic numList = JsonConvert.DeserializeObject(
    @"[{
        ""633"": [{
            ""8768"": ""hello"",
            ""8769"": ""world""
        }],
        ""634"": [{
            ""8782"": ""on"",
            ""8783"": ""No""
        }]
    }]"
    );

foreach (dynamic recordList in numList)
    foreach (dynamic record in recordList)
    {
        //recordKey would be "633" for:
        //"633": [{
        //    "8768": "hello"
        //}]
        var recordKey = record.Name;

        //.First.First because of the awkward JSON structure.
        foreach (dynamic entry in record.First.First)
        {
            //for {"8768": "hello"}
            //key would be "8768", value would be "hello"
            var key = entry.Name;
            var value = entry.Value;
        }
    }

然后您可以获取recordKey和条目键/值,并使用它们(包括将它们填充到您喜欢的任何格式化数据结构中)。

比尝试使用键入的反序列化值更好:

List<Dictionary<int, List<Dictionary<int, string>>>>

...反正。