JSON.NET 加载json字符串时,怎么样自定义映射到某个属性

.Net技术 码拜 9年前 (2016-03-12) 831次浏览
JSON.NET 加载json字符串时,怎么样自定义映射到某个属性?
例如,原来写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
但你们的讨论中,是以已知差异的具象为前提的:差异不同,代码也不同
而事实是:你根本就不会知道你明天会有什么新想法
也就是你不可能预知未来的差异会在哪里和是什么
假如出现差异就修改程序,显然就离开了问题的初衷

2

本人觉得你有空讨论这个,还不如本人实现一个json,又不是很复杂的工作

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明JSON.NET 加载json字符串时,怎么样自定义映射到某个属性
喜欢 (0)
[1034331897@qq.com]
分享 (0)