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

时间:2016-04-19 13:02:14

标签: c# json

背景

所以我决定开始在某些C#程序中使用JSON而不是XML。当然,我发现的第一件事是Newtonsoft的JSON.NET。这似乎是在.NET世界中用于某些JSON解析的合理的事情,并且每个人都通过Microsoft提供的内置序列化程序建议它。这就是我决定使用的。到目前为止,除了...... This one here.

之类的非常简单的例子之外,我还无法对其进行反序列化。

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

  

其他信息:无法反序列化当前的JSON数组   (例如[1,2,3])因为类型而进入'JsonTest.testObjects'类型   需要一个JSON对象(例如{“name”:“value”})来反序列化   正确。

     

要修复此错误,请将JSON更改为JSON对象(例如   {“name”:“value”})或将反序列化类型更改为数组或a   实现集合接口的类型(例如ICollection,IList)   像可以从JSON数组反序列化的List。   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"
                            ]
                    ]
            ]
    ]
}

好的,然后是反序列化代码。

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

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

    // de-serialize the JSON
    newTest = JsonConvert.DeserializeObject<Test>(testData);

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

问题

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

2 个答案:

答案 0 :(得分:7)

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

{
    "name": "myTest",
    "testObjects": [
        "testObject":
        "name": "Operator Tests",
        "index": 1,

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

答案 1 :(得分:2)

要从JSON生成C#类,请尝试使用:http://json2csharp.com/

有效 JSON生成:

public class Step
{
    public string name { get; set; }
    public List<string> Parameters { get; set; }
}

public class SubTest
{
    public string name { get; set; }
    public int index { get; set; }
    public string description { get; set; }
    public List<Step> Steps { get; set; }
}

public class TestObject
{
    public string name { get; set; }
    public int index { get; set; }
    public string description { get; set; }
    public List<SubTest> SubTests { get; set; }
}

public class RootObject
{
    public string name { get; set; }
    public List<TestObject> testObjects { get; set; }
}