【发布时间】:2019-10-31 20:06:08
【问题描述】:
所以我有一个正在开发的 API 和前端,当其中一个值可能是多个不同类型的列表时,我需要一种反序列化 JSON 的方法。目前我正在将其反序列化为List<dynamic>,但在我的上下文中使用它是一个巨大的痛苦。
public class WorkbenchAPI
{
public string status { get; set; }
public HttpStatusCode code { get; set; }
public string error { get; set; }
public string guid { get; set; }
public List<dynamic> results { get; set; }
}
示例 JSON
{
"status": "ok",
"code": 200,
"error": null,
"guid": "1234",
"results": [
{
"SamAccountName": "dizbuster",
"CN": "Buster, Diz",
"EmailAddress": "dizbuster@whatever.com",
}
]
}
在上面的 JSON 示例中,结果应该被反序列化为类型 List<ClassA>,例如。
{
"status": "ok",
"code": 200,
"error": null,
"guid": "1234",
"results": [
{
"data": "127.0.0.1",
"owner": "dizbuster",
"email": "dizbuster@whatever.com",
},
{
"data": "192.168.0.1",
"owner": "dizbuster",
"email": "dizbuster@whatever.com",
}
]
}
在此示例中,结果应反序列化为List<ClassB>。
有些字段名称可能会以不同的类型显示,但有些则不会。从功能上讲,它们是两种不同的类型,表示来自两个单独的 API 调用的输出,因此我希望将其反序列化为特定的对象类型,而不是使用 dynamic 或包含所有可能字段的整体对象。
目前我正在使用List<dynamic> 并将其序列化回一个临时的JSON 字符串,然后将其再次反序列化为List<ClassA> 或其他。这似乎是一种不好的方法,并且使用起来很麻烦。
有没有更好的方法来构造它或处理序列化/反序列化?我对两端都有完全的控制权,所以如果需要的话我也不会太难改变 JSON。另外,我知道一个特定的 API 调用将返回看起来像这样的 JSON,而另一个 API 调用将返回看起来像这样的 JSON。每个案例都应该产生一个不同类型的列表
【问题讨论】:
-
let myObj = JSON.parse(response); let myList = myObj.results;怎么样?这将返回一个 JS 数组(与一些强类型的List<>相比)。这还不够吗? -
从功能上讲,它们是两种不同的类型,表示来自两个单独的 API 调用的输出——这是否意味着您提前知道
results类型? -
因为如果您事先知道类型,将
WorkbenchAPI更改为通用WorkbenchAPI<T> { public List<T> results { get; set; } // ...是可行的方法。 -
@dbc 我知道对于给定类型的 JSON 结构是什么。我知道一个特定的 API 调用将返回类似于 this 的 JSON,而另一个 API 调用将返回类似于 that 的 JSON。每个案例都应该产生一个不同类型的列表