JSON.NET 加载json字符串时,怎么样自定义映射到某个属性?
例如,原来写JSON时属性叫“Name”,现在叫”NewName“,怎么样把旧的名称,映射到新的属性上?
有没有相似 IXmlSerializable的接口,可以自定义读写过程?
例如,原来写JSON时属性叫“Name”,现在叫”NewName“,怎么样把旧的名称,映射到新的属性上?
有没有相似 IXmlSerializable的接口,可以自定义读写过程?
解决方案
10
class My { [JsonProperty(PropertyName = "Name", DefaultValueHandling = DefaultValueHandling.Ignore)] private string _name_for_old_contract { get { return null; } set { NewName = value; } } [JsonProperty] public string NewName { get; set; } }
40
新旧名字问题没办法,读出来后你可以通过automapper再映射到最新的实体
5
直接映射不行,你要先重新定义一个json结构体,然后把新旧JSON合并
160
兼容性是永远存在的问题,不论你用什么方式来“处理”,总之都抹不掉痕迹。
但是你可以用“倒置”的方式来重构你的系统。例如原来有一个
但是你可以用“倒置”的方式来重构你的系统。例如原来有一个
class 包厢 { public string 门牌号; public int 价格; ................... }
后来改为
public 包厢 { public string 包厢号; public int 价格; .............. }
假设此时不允许暴露“门牌号”字段,那么你需要为以前的数据单独设计一个兼容类型,例如
internal 包厢V1版 : 包厢 { public string 门牌号 { get{ return this.包厢号; } set{ this.包厢号 = value; } } }
并且在可以确定是新数据上使用“包厢”,在不确定只有新数据时使用“包厢V1版”。
等将来再删除包厢V1版,或永远也不删除。但是新系统,对外已经不提供包厢V1版的类型定义了。
3
感觉你们讨论是没有意义的
题主最初的问题应该是兼容不同来源 json
但你们的讨论中,是以已知差异的具象为前提的:差异不同,代码也不同
而事实是:你根本就不会知道你明天会有什么新想法
也就是你不可能预知未来的差异会在哪里和是什么
假如出现差异就修改程序,显然就离开了问题的初衷
题主最初的问题应该是兼容不同来源 json
但你们的讨论中,是以已知差异的具象为前提的:差异不同,代码也不同
而事实是:你根本就不会知道你明天会有什么新想法
也就是你不可能预知未来的差异会在哪里和是什么
假如出现差异就修改程序,显然就离开了问题的初衷
2
本人觉得你有空讨论这个,还不如本人实现一个json,又不是很复杂的工作