Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不能用JSON.NET反序列化这个JSON?_C#_Json - Fatal编程技术网

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

C# 为什么我不能用JSON.NET反序列化这个JSON?,c#,json,C#,Json,背景 所以我决定开始在一些C程序中使用JSON而不是XML。当然,我发现的第一件事是Newtonsoft的JSON.NET。对于.NET世界中的一些JSON解析来说,这似乎是一种合理的方法,每个人都建议使用它,而不是使用Microsoft提供的内置序列化程序。这就是我决定使用的。到目前为止,我还不能反序列化任何东西,但非常琐碎的例子,如 我正在尝试将以下JSON反序列化为一个有意义的对象,我可以将其用于我的程序,但是每次我尝试这样做时,应用程序都会崩溃。对于异常消息中发生的事情,我得到了一个非常

背景

所以我决定开始在一些C程序中使用JSON而不是XML。当然,我发现的第一件事是Newtonsoft的JSON.NET。对于.NET世界中的一些JSON解析来说,这似乎是一种合理的方法,每个人都建议使用它,而不是使用Microsoft提供的内置序列化程序。这就是我决定使用的。到目前为止,我还不能反序列化任何东西,但非常琐碎的例子,如

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

其他信息:无法反序列化当前JSON数组 e、 将[1,2,3]转换为类型“JsonTest.testObjects”,因为 需要一个JSON对象,例如{name:value}来反序列化 没错

要修复此错误,请将JSON更改为JSON对象,例如。 {name:value}或将反序列化类型更改为数组或 实现集合接口的类型,例如ICollection、IList 类似于可以从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"
                            ]
                    ]
            ]
    ]
}
好的,这是反序列化代码

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

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

    // de-serialize the JSON
    newTest = JsonConvert.DeserializeObject<Test>(testData);
然后,这里是正在反序列化的测试类。测试对象是包含所有测试对象的对象。在明确要求之前,我最初不会提供关于子类的信息,因为我相信问题可能在JSON的某个地方。我将提供尽可能多的细节,因为任何人要求我,只要问

问题:

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

不合法的JSON:use

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

要从JSON生成C类,请尝试使用:

从有效的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; }
}

这不是合法的Json:testObject:name:Operator测试,数据是否缺少som大括号?您已经在“testObject”后面缩进了信息,但它不是合法对象。@LasseV.Karlsen不,我不知道。有。。。3个步骤各1个。步骤为1。1分测验。1用于测试对象。。。那么,不?是的,那不是json。这是类似于伪标记的json,您没有有效的json。把它插上,你会看到的。如果反序列化为特定类型时遇到问题,则需要在问题中包含该类型。我是否需要testObjects的中间类,或者我可以作为IList执行此操作?能否为顶级类提供相应的C代码?我仍然会遇到相同的异常。对于解析,我建议使用所用代码对StackOverflow提出不同的问题。我是否需要使用[JsonProperty]标记元素很有帮助?我建议您仅标记元素,您希望使用[ScriptIgnore]忽略这些元素。如果希望在json和c中以不同的方式命名属性,则只需要JsonProperty我不建议这样做:这样我就可以把它放在那里,它应该如何工作?我对XML世界已经习以为常了。通常,给这些类起一些自解释的名字,我假设您在这里使用示例代码
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; }
}