C# 为什么我不能用JSON.NET反序列化这个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数组反序列化 也许是说我的第一个物体有问题?在我进入子类之前,我不会在这里使用任何数组,不确定这里发生了什么C# 为什么我不能用JSON.NET反序列化这个JSON?,c#,json,C#,Json,背景 所以我决定开始在一些C程序中使用JSON而不是XML。当然,我发现的第一件事是Newtonsoft的JSON.NET。对于.NET世界中的一些JSON解析来说,这似乎是一种合理的方法,每个人都建议使用它,而不是使用Microsoft提供的内置序列化程序。这就是我决定使用的。到目前为止,我还不能反序列化任何东西,但非常琐碎的例子,如 我正在尝试将以下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; }
}