Json.net反序列化null guid案例

Adr*_*zea 8 c# serialization json json.net

我正在使用Json.NET包含Guid类型的私有字段和该字段的公共属性的对象反序列化.当Guid我的json中的值为null时,我想分配Guid.Empty给我的字段.

public class MyClass
{
    private Guid property;
    public Guid Property
    {
        get { return property; }
        set 
        {
            if (value == null)
            {
                property = Guid.Empty;
            }
            else
            {
                property = value;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是deserializer想要访问私有字段,导致我在尝试反序列化时遇到此错误:

将值{null}转换为类型'System.Guid'时出错.路径'[0] .property',第6行,第26位.

如何让它忽略私有字段并使用公共属性呢?

dbc*_*dbc 18

Json.NET拒绝null为a 设置值,Guid因为它是一个不可为空的值类型.尝试(Guid)null立即窗口中输入,您将看到一条错误消息,指示无法在.Net中进行此转换.

要解决此问题,您有以下几种选择:

  1. 创建一个可以为Guid?空的代理属性.只要它具有[JsonProperty]属性,它可以是私有的:

    public class MyClass
    {
        [JsonIgnore]
        public Guid Property { get; set; }
    
        [JsonProperty("Property")]
        Guid? NullableProperty { get { return Property == Guid.Empty ? null : (Guid?)Property; } set { Property = (value == null ? Guid.Empty : value.Value); } }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个JsonConverternullJson标记转换为默认Guid值的文件:

    public class NullToDefaultConverter<T> : JsonConverter where T : struct
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(T);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var token = JToken.Load(reader);
            if (token == null || token.Type == JTokenType.Null)
                return default(T);
            return token.ToObject(objectType);
        }
    
        // Return false instead if you don't want default values to be written as null
        public override bool CanWrite { get { return true; } }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (EqualityComparer<T>.Default.Equals((T)value, default(T)))
                writer.WriteNull();
            else
                writer.WriteValue(value);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后将其应用于您的类型,如下所示:

    public class MyClass
    {
        [JsonConverter(typeof(NullToDefaultConverter<Guid>))]
        public Guid Property { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    或者,您可以T通过添加转换器将转换器应用于所有类型的值JsonSerializerSettings.Converters.并且,要在全局注册这样的转换器,请参阅例如在Json.Net中为控制台应用程序全局注册自定义JsonConverter,如何在MVC 4 Web API中为Json.NET设置自定义JsonSerializerSettings?对于Web API,或设置JsonConvert.DefaultSettings,asp net core 2.0无法正常工作,因为ASP.NET Core.


归档时间:

查看次数:

8898 次

最近记录:

7 年,2 月 前