2017-08-02 66 views
1

我正在使用REST API,目前我无法控制并且已经构建了模型来与我从Api接收的json相对应。JsonConvert .NET序列化/反序列化只读

有问题的Api虽然不允许我推送整个模型时做一个帖子,所以我需要找到一种方法来完全反序列化JSON,但只有在序列化时写入选定的数据。

到目前为止,我已经尝试过JsonIgnore,它在锡上表示完全忽略了它的属性。

然后我创建了一个自定义属性JsonWriteAttribute,并将其应用到我想串行化的属性。

我已经看过重写DefaultContractResolver的CreateProperties方法,然后只获得属性的属性,但我似乎无法确定从方法或解析器中的属性,如果我正在读或写。

我也试过看看一个自定义的JsonConverter,但它似乎是从我不能中断管道,然后处理所有的写自己。我在这里错过了什么,因为它看起来是正确的想法?

当使用Json.Net进行序列化,反序列化时,任何人都想出了一种将属性标记为ReadOnly的方法?

感谢

+0

您可以使用两个班,一个来自其他遗传,然后序列化父类和反序列化到子类? –

+0

我最近做了一些相当类似的事情,并使用了自定义的JsonConverter选项。我所做的是将自定义属性添加到属性中,并在自定义JsonConverter中使用Reflection来获取所有属性并根据属性更改序列化逻辑。认为沿着这些线应该为你工作。 – ajg

回答

0

一种可能性有条件还原序列化的属性是ShouldSerialize

http://www.newtonsoft.com/json/help/html/ConditionalProperties.htm

创建它返回一个布尔值,以确定您的属性应序列化与否的方法。该方法从ShouldSerialize开始并以您的属性名称结束。例如ShouldSerializeMyProperty

一个例子

public MyClass 
{ 
    public string MyProp { get; set; } 
    public string ExcludeThisProp { get; set; } 
    public int MyNumber { get; set; } 
    public int ExcludeIfMeetsCondition { get; set; } 

    //Define should serialize options  
    public bool ShouldSerializeExcludeMyProp() { return (false); } //Will always exclude 
    public bool ShouldSerializeExcludeIfMeetsCondition() 
    { 
     if (ExcludeIfMeetsCondition > 10) 
      return true; 
     else if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) 
      return true; 
     else 
      return false; 
    } 
}