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; }