为什么我不能用JSON.NET反序列化这个JSON?

Sno*_*oop 0 c# json

背景

所以我决定开始在某些C#程序中使用JSON而不是XML.当然,我发现的第一件事是Newtonsoft的JSON.NET.这似乎是在.NET世界中用于某些JSON解析的合理的事情,并且每个人都通过Microsoft提供的内置序列化程序建议它.这就是我决定使用的.到目前为止,我还没有能够反序列化任何东西,除了非常简单的例子,例如...... 这一个.

我试图将以下JSON反序列化为一个有意义的对象,我可以将其用于我的程序,但是每次我尝试这样做时应用程序都会崩溃.我对异常消息中发生的事情进行了非常含糊的解释.我没有得到一个行号或任何东西,只是说......

附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为类型"JsonTest.testObjects",因为该类型需要JSON对象(例如{"name":"value"})才能正确反序列化.

要修复此错误,请将JSON更改为JSON对象(例如{"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化.JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化.

也许它说我的第一个物体有问题?在进入子类之前,我没有在这里使用任何数组,不确定这里发生了什么.

{
    "name":"myTest",
    "testObjects":[
        "testObject":
            "name":"Operator Tests",
            "index":1,
            "description":"Test out the operator interface.",
            "SubTests":[
                "SubTest":
                    "name":"Display Test",
                    "index":4,
                    "description":"Testing for display faults.",
                    "Steps":[
                        "Step":
                            "name":"Configuration #1",
                            "Parameters":[
                                "Mode-A",
                                "Unit #1"
                            ],
                        "Step":
                            "name":"Configuration #2",
                            "Parameters":[
                                "Mode-B",
                                "Unit #1"
                            ],
                        "Step":
                            "name":"Configuration #3",
                            "Parameters":[
                                "Mode-C",
                                "Unit #1"
                            ]
                    ]
            ]
    ]
}
Run Code Online (Sandbox Code Playgroud)

好的,然后这里是反序列化代码.

    Test newTest = null;
    String testData = String.Empty;

    // read the file
    testData = File.ReadAllText("Test.json");

    // de-serialize the JSON
    newTest = JsonConvert.DeserializeObject<Test>(testData);
Run Code Online (Sandbox Code Playgroud)

然后,Test这是被反序列化的类.该Test物体是一个容纳所有的对象testObjects.在明确要求之前,我最初不会提供有关子类的信息,因为我相信问题可能在我的JSON开始的某个地方.我会提供尽可能多的细节,只要问我!

为什么这不会序列化,这个异常/消息实际告诉我什么?

Rvd*_*vdK 7

不合法的JSON:使用http://jsonlint.com/

{
    "name": "myTest",
    "testObjects": [
        "testObject":
        "name": "Operator Tests",
        "index": 1,
Run Code Online (Sandbox Code Playgroud)

testObjects是一个数组,但您在其中指定了键值对.因此内容应该是对象或对象列表.

我想你想要这样的东西:

{
    "name":"myTest",
    "testObjects":[
        {
            "name":"Operator Tests",
            "index":1,
            "description":"Test out the operator interface.",
            "SubTests":[
                {
                    "name":"Display Test",
                    "index":4,
                    "description":"Testing for display faults.",
                    "Steps":[
                        {
                            "name":"Configuration #1",
                            "Parameters":[
                                "Mode-A",
                                "Unit #1"
                            ]
                        },
                        {
                            "name":"Configuration #2",
                            "Parameters":[
                                "Mode-B",
                                "Unit #1"
                            ]
                        },
                        {
                            "name":"Configuration #3",
                            "Parameters":[
                                "Mode-C",
                                "Unit #1"
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)