【发布时间】:2014-09-17 17:52:55
【问题描述】:
正在反序列化一个动态 JSON 文件,该文件可能包含 2 个单独的类,我不知道数组中将包含哪种类型的数据。
问题是,我将根对象反序列化为“Base”类型,“subtests”对象被反序列化为“Subtest”,但“subtests”数组可能是“Base”类型或“Subtest”类型。
问题: 我将如何以编程方式确定对象是否包含“subtest”,我反序列化为 Base,如果不包含,它应该反序列化为“Subtest”?
我非常感谢在这方面的帮助,因为我的时间很短。
(编辑:添加 cmets 以显示每个对象应反序列化的类型) 这是一个示例(JSON 数据):
{
// Deserializes to type "Base"
"host": "123456",
"last_time": "2014-09-15 07:04:49.205000",
"name": "myName",
"result": "FAIL",
"serial": "12345",
"start_time": "2014-09-15 06:53:36.976000",
// Deserializes to type "List<Subtest>"
"subtests": [
{
"data": {
"moredata": {
"ver": "123",
"real": 123
}
},
"description": "Description of Data",
"host": "123456",
"last_time": "2014-09-15 20:32:31.095000",
"name": "testname.py",
"result": "PASS",
"start_time": "2014-09-15 20:32:25.873000",
"version": "2.014.09.15"
},
{
// Nested within Subtest Array, Should deserialize to type "Base" again
"host": "123456",
"last_time": "2014-09-15 07:04:49.205000",
"name": "name of test suite",
"result": "FAIL",
"start_time": "2014-09-15 06:53:36.976000",
//Should deserialize to type "List<Subtest>"
"subtests": [
{
"description": "Description of Data",
"host": "123456",
"last_time": "2014-09-15 06:53:40.440000",
"name": "testname.py",
"result": "FAIL",
"start_time": "2014-09-15 06:53:36.976000",
"version": "2.014.09.15"
},
{
"description": "Test Description",
"host": "123456",
"last_time": "2014-09-15 06:54:34.905000",
"name": "testname.py",
"result": "PASS",
"start_time": "2014-09-15 06:54:34.827000",
"version": "2.014.09.15"
},
{
"host": "123456",
"last_time": "2014-09-15 06:55:01.156000",
"name": "testname.py",
"result": "FAIL",
"start_time": "2014-09-15 06:55:01.156000",
"version": "2.014.09.15"
},
],
"version": "1.45"
}
],
"version": "1.23"
}
示例(代码):
public class Base{
public string host { get; set; }
public DateTime last_time { get; set; }
public string name { get; set; }
public string result { get; set; }
public string serial { get; set; }
public DateTime start_time { get; set; }
public List<Subtest> subtests { get; set; }
public string version { get; set; }
}
public class Subtest {
[JsonProperty("data")]
public JObject Data { get; set; } // CHECK
[JsonProperty("description")]
public string Description { get; set; } // CHECK
[JsonProperty("host")]
public string Host { get; set; }
[JsonProperty("info")]
public List<StatusDetails> Info { get; set; }
[JsonProperty("last_time")]
public DateTime LastRunTime { get; set; }
[JsonProperty("name")]
public string TestName { get; set; }
[JsonProperty("result")]
public string SubtestRunResult { get; set; }
[JsonProperty("start_time")]
public DateTime StartTime { get; set; }
[JsonProperty("trace")]
public List<object> Trace { get; set; }
[JsonProperty("version")]
public string Version { get; set; }
}
【问题讨论】:
-
JSON 比 XML 轻量级的原因是它省略了对象类型(即 XML 中的标记元素)。我不知道如何为这个确切的答案提供帮助,但这可能是您想要考虑更完整且更复杂的序列化方法的罕见场景之一。
-
Base和Subtest是否共享一个共同的基本类型?否则你会得到一个List<object>,这不会很有帮助。 -
我将整个文件反序列化为 Base 类型,其中 subtests 对象反序列化为 List
。其中,数组可以再次包含“Base”或“Subtest”。我只需要找出一种方法来确定是否反序列化到基类(如果它包含测试套件)或 Subtest(如果它是子测试)。我不控制传入的数据,所以无法序列化。 -
正确,所以如果您的列表可以包含两种类型(
Subtest和Base),则该属性不能是List<Subtest>。它必须是List<object>或List<SomeBaseTypeThatBothInheritFrom>才能包含这两种类型。 -
这很好,但是一旦我将对象列表反序列化为对象,我如何确定它应该反序列化为“Base”或“Subtest”?只需在对象上运行 foreach 并检查“子测试”是否是键?
标签: c# json json.net deserialization