0

我需要反序列化具有多个嵌套 Json 数组的下一个 Json 字符串:

{"d1":[["11791452",[["980",""]]],["11791453",[["1060",""],["1140",""],["1220",""],["1300",""]]],["11791454",[["1070",""]]]]}

我尝试分几个步骤来完成,到目前为止,我能够反序列化三层嵌套数组。如下:

{"aOaOa":[[["1060",""],["1140",""],["1220",""],["1300",""]]]}

public class ThreeSimpleNestedArrays
{
    public List<List<string[]>> aOaOa;  //array of arrays of arrays

    public ThreeSimpleNestedArrays()
    {
        aOaOa = new List<List<string[]>>();
    }
}

但是当我在数组结构中添加额外的字符串时出现问题:

{"TEST": [["11791453",[["1060",""],["1140",""],["1220",""],["1300",""]]],["123456",[["0","1"],["2","3"]]]]}

public class ComplexNestedArray
{
    public List<Dictionary<string,List<string[]> >> TEST;

    public ComplexNestedArray()
    {
        TEST = new List<Dictionary<string, List<string[]>>>();
    }
}

我收到下一条错误消息:“无法将 'System.String' 类型的对象转换为 'System.Collections.Generic.Dictionary`2[System.String,System.Object]'。”

我错过了什么?

任何人都可以建议一种方法来反序列化像这样嵌套在使用 DataContractJsonSerializer 的 Json 数组中的对象吗?

我用来反序列化的代码是下一个:

//Works
 DataContractJsonSerializer dcJsonSer = new DataContractJsonSerializer(typeof(ThreeSimpleNestedArrays));
        ThreeSimpleNestedArrays root = (ThreeSimpleNestedArrays)dcJsonSer.ReadObject(str);
//Don't work
        DataContractJsonSerializer dcJsonSer = new DataContractJsonSerializer(typeof(ComplexNestedArray));
        ComplexNestedArray root = (ComplexNestedArray)dcJsonSer.ReadObject(str);

顺便说一句,当它被序列化为 Json 对象时,我能够对对象进行反序列化,如下所示:

 {"TEST": [{"s": "11791453","aOa": [["1060",""],["1140",""],["1220",""],["1300",""]]},{"s": "123456","aOa":[["0","1"],["2","3"]]}]}    

使用具有两个成员的类(字符串“s”和字符串 []“aOa”的列表),但没有名称,当对象被序列化为数组时,我无法做到这一点。

有什么建议吗?

4

2 回答 2

3

好吧,它看起来DataContractJsonSerializer比我更聪明。

事实证明,反序列化嵌套对象数组的孩子的方法是使用这样的类:

public class ComplexNestedArray
{
    //{"TEST": [["11791453",[["1060",""],["1140",""],["1220",""],["1300",""]]],["123456",[["0","1"],["2","3"]]]]}

    public List<List<object>> TEST { get; set; }
} 

之后,只需执行几个for循环并转换为适当的类结构即可。

顺便说一句,如果您必须处理 Json,这在您的工具箱中是必须的:

json2csharp

于 2013-05-12T00:23:32.163 回答
0

这是我的解决方案。但是,我稍后会尝试为您的完整 json 添加一种方式:

class Program {
    static void Main(string[] args) {
        new Program();
    }

    public Program() {
        string full = "{\"d1\":[[\"11791452\",[[\"980\",\"\"]]],[\"11791453\",[[\"1060\",\"\"],[\"1140\",\"\"],[\"1220\",\"\"],[\"1300\",\"\"]]],[\"11791454\",[[\"1070\",\"\"]]]]}";
        string simple1 = "{\"aOa\":[[\"1060\",\"\"],[\"1140\",\"\"],[\"1220\",\"\"],[\"1300\",\"\"]]}";
        string simple2 = "{\"aOaOa\":[[[\"1060\",\"\"],[\"1140\",\"\"],[\"1220\",\"\"],[\"1300\",\"\"]]]}";

        DataContractJsonSerializer d1 = new DataContractJsonSerializer(typeof(S1));
        S1 r1 = (S1)d1.ReadObject(new MemoryStream(Encoding.Default.GetBytes(simple1)));
        DataContractJsonSerializer d2 = new DataContractJsonSerializer(typeof(S2));
        S2 r2 = (S2)d2.ReadObject(new MemoryStream(Encoding.Default.GetBytes(simple2)));
        Console.WriteLine("done");
        Console.ReadKey();
    }

    [DataContract]
    class S1 {
        [DataMember]
        List<List<String>> aOa;
    }

    [DataContract]
    class S2 {
        [DataMember]
        List<List<List<string>>> aOaOa;
    }
}
于 2013-05-05T18:58:59.353 回答