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中进行此转换.
要解决此问题,您有以下几种选择:
创建一个可以为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)创建一个JsonConverter将nullJson标记转换为默认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 次 |
| 最近记录: |