c# - 将 JSON 反序列化为不同的对象结构
问题描述
我确定有人问过这个问题,但我找不到它,可能是因为我不知道它的条款是什么。假设我有以下内容:
JSON
{
"Field1": 1234,
"Field2": 5678,
"MoreData": {
"Field3": 9012,
"Field4": 3456
},
"Field5": "Test"
}
班级
public class Sample()
{
public int Field1 { get; set; }
public int Field2 { get; set; }
public int Field3 { get; set; }
public int Field4 { get; set; }
public string Field5 { get; set; }
}
如果我反序列化此 Field1、Field2 和 Field5 将被填充,但有没有办法让 Field3 和 Field4 也以简单的方式填充。
我不想为 Field2 和 Field3 提供公共类 MoreData。
解决方案
如果您无法更改模型,请尝试以下操作:
public class SampleContractResolver : DefaultContractResolver
{
private Dictionary<string, string> PropertyMappings { get; set; }
public CustomContractResolver()
{
this.PropertyMappings = new Dictionary<string, string>
{
{"Field3", "MoreData.Field3"},
{"Field4", "MoreData.Field4"},
};
}
protected override string ResolvePropertyName(string propertyName)
{
string resolvedName = null;
var resolved = this.PropertyMappings.TryGetValue(propertyName, out resolvedName);
return (resolved) ? resolvedName : base.ResolvePropertyName(propertyName);
}
}
并像这样使用它:
var sample = JsonConvert.DeserializeObject<Sample>(json, new JsonSerializerSettings(){
ContractResolver = new SampleContractResolver()
});
推荐阅读
- pytorch - 任意选择的值作为标准化的标准/平均值。为什么?
- c# - 在 C# 中将类实例转换为原始字节数组
- android - 如何从不同的谷歌帐户的firebase控制台/android工作室查看、修改现有firebase android项目的数据库?
- python - 解包值过多时出现错误(预期2)
- python - 扩展模板中的 Django 表单
- r - 使用 rvest 进行网页抓取:无法区分的 CSS 选择器阻止我抓取某些块
- html - 创建一个内部显示“是”“否”的开关切换
- laravel - 多态OneToMany图像-产品关系,如何知道哪些图像是哪些?
- ruby-on-rails - 生产中的rails 6 webpacker:rake assets:precompile失败
- javascript - Emscripten - 有没有办法从 JavaScript 中止执行?