背景
所以我决定开始在某些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开始的某个地方。我会提供尽可能多的细节,只要问一下!
问题
为什么这不会序列化,这个异常/消息实际告诉我什么?
答案 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; }
}