Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json.net反序列化空guid大小写_C#_Json_Serialization_Json.net - Fatal编程技术网

C# Json.net反序列化空guid大小写

C# Json.net反序列化空guid大小写,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在使用Json.NET反序列化一个对象,该对象包含Guid类型的私有字段和该字段的公共属性。当我的json中我的Guid的值为空时,我想将Guid.Empty分配给我的字段 public class MyClass { private Guid property; public Guid Property { get { return property; } set { if (value ==

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

public class MyClass
{
    private Guid property;
    public Guid Property
    {
        get { return property; }
        set 
        {
            if (value == null)
            {
                property = Guid.Empty;
            }
            else
            {
                property = value;
            }
        }
    }
}
但是,
反序列化程序
想要访问私有字段,因为我在尝试反序列化时遇到此错误:

将值{null}转换为类型“System.Guid”时出错。路径 “[0]。属性”,第6行,位置26


如何使其忽略私有字段而改用公共属性?

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

要解决此问题,您有两个选择:

  • 创建
    Guid?
    nullable代理属性。如果您愿意,它可以是私有的,只要它有一个属性:

    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); } }
    }
    
  • 创建将
    null
    Json令牌转换为默认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); // Deserialize using default serializer
        }
    
        // 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);
        }
    }
    
    当然,如果您这样做,您的Guid将被重新序列化为
    “00000000-0000-0000-0000-000000000000”
    。要改进您可能会在序列化过程中忽略空Guid值的应用,请执行以下操作:

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore)]
    public Guid Property { get; set; }
    
    请注意,如果在反序列化过程中调用的具有相同名称的不可为null的Guid参数,则可能需要不同的方法


  • 非常感谢。关于空到默认转换器的一个问题。我是否必须手动将JsonConverter属性添加到类中的每个字段/属性,或者我是否可以为类中的所有属性添加该属性?您可以将其添加到每个属性,也可以将其注册以在所有类中全局使用。看,第三种选择正是我所需要的。感谢您为可能的用例提供了广泛的答案。
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore)]
    public Guid Property { get; set; }