【发布时间】:2017-08-23 00:24:57
【问题描述】:
给定一些看起来像的 json
{
"id":"123_678",
"fs_123_678":
{
"title":"Apple Parts",
"data": 134
}
}
我想将其反序列化为以下类
public class Result
{
public string Id {get; set;}
public ResultInfo Info {get; set;}
}
public class ResultInfo
{
public string Title {get; set;}
public int Data {get; set;}
}
...但是第二个属性 (fs_123_678) 不是固定名称。我在这里查看了关于 SO 的其他类似帖子,常见的解决方案是使用 IDictionary<string, MyPoco> 但是,这仅在变量数据 not 在根级别时才有效。 属性的名称是 100% 可预测的,我可以根据源 HTTP 请求中使用的值在代码中描述给定 JSON 响应的名称。诀窍是,我如何让 JSON 反序列化器参与到业务规则中,围绕这个给定的反序列化将调用什么?我基本上需要类似[JsonProperty(PropertyName = *insert logic here*)] 的东西(这当然是不可能的)。
什么是处理这个问题的合理方法,同时保留对象其余部分的“免费”强类型反序列化?
【问题讨论】:
-
我会编写一个自定义反序列化器(JSON.NET 在他们的网站上有一篇很棒的文章)。
-
@SamAxe 太棒了,我正在查看“序列化和反序列化 JSON”部分 (newtonsoft.com/json/help/html/SerializingJSON.htm),但没有看到任何可以帮助我的东西 - 但也许我错过了?偶然得到一个方便的花花公子链接?
-
您可以使用来自How to deserialize a child object with dynamic (numeric) key names? 的
[JsonTypedExtensionData]和TypedExtensionDataConverter<ResultInfo>。或者您可以为Result编写自定义JsonConverter,如this answer 或this one 所示。
标签: c# json json.net json-deserialization