【问题标题】:JSON.NET (WebApi2) - Serialize property, but skip during deserializationJSON.NET (WebApi2) - 序列化属性,但在反序列化期间跳过
【发布时间】:2015-07-30 11:02:46
【问题描述】:

我知道[JsonIgnore] 完全忽略了属性,我知道ShouldSerializePropertyName 提供了条件序列化,但是我找不到任何东西可以将属性标记为正常序列化为JSON,但在反序列化期间没有设置。

我可以写一个解决方法:

[JsonIgnore]
public string MyValue{get;set;}

public string MyValueForJson {get{return MyValue;}

但这是最后的手段。除了自定义转换器等之外,有什么方法可以表达我不希望在反序列化期间填充该字段?

【问题讨论】:

  • 附带说明:出于各种原因,我决定实际使用单独的模型进行序列化/反序列化,所以这个问题不再重要 - 但是,我认为这仍然是一个好问题 :)
  • 奇怪的是我们在同一天提出了这个问题:stackoverflow.com/questions/31731320/… 直到我输入了我的,我才看到你的,但我没有找到其他人问这个。

标签: c# .net json.net


【解决方案1】:

据我了解,您希望使用 json 字符串中的所有属性序列化对象,但在对该字符串进行反序列化时仅检索选定的属性。

如果是这种情况,我有一个类似的要求,我创建了 BaseType 和 DerivedType 类,然后我将派生类型序列化为 Json 字符串,而反序列化我希望它在 Base 类型实例中。于是写了这段代码:

    using System.Web.Script.Serialization;

    public static TB CastToBase<T, TB>(this T derivedTypeInstance) 
        {
            var serializer = new JavaScriptSerializer();
            var baseTypeInstance = serializer.Deserialize<TB>(serializer.Serialize(derivedTypeInstance));
            return baseTypeInstance;
        } 

【讨论】:

  • 我喜欢它——尽管对于类层次结构应该用于什么有点牵强 ;)
【解决方案2】:

我认为您可以将 [JsonObject(MemberSerialization.OptIn)] 属性放在类上,这需要明确说明要序列化的属性。然后,您可以在要正常序列化但在反序列化时忽略的属性上同时使用 [JsonProperty] 和 [JsonIgnore]。

例子:

    [JsonObject(MemberSerialization.OptIn)]
    private class UserData
    {
        [JsonProperty]      
        public string Token { get; set; }

        [JsonProperty]
        public string Username { get; set; }

        [JsonIgnore]
        [JsonProperty]
        public string Password { get; set; }
    }

【讨论】:

  • 我不相信这会奏效。文档 (newtonsoft.com/json/help/html/…) 指出: OptOut - 默认情况下对所有公共成员进行序列化。可以使用 JsonIgnoreAttribute 或 NonSerializedAttribute 排除成员。 OptIn - 只有成员必须用 JsonPropertyAttribute 标记或 DataMemberAttribute 被序列化。
  • 查看文档中的 OptIn 属性,这就是我使用的属性
  • 这行得通吗?我认为JsonIgnore 用于OptOutJsonProperty 用于OptIn,但无论哪种方式,这些属性都会影响序列化和反序列化,而不仅仅是硬币的一方面。
猜你喜欢
  • 2020-06-08
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多