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); } } }
- 创建一个
JsonConverter
将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); } }
然后将其应用于您的类型,如下所示:
public class MyClass { [JsonConverter(typeof(NullToDefaultConverter<Guid>))] public Guid Property { get; set; } }
或者,您可以
T通过将转换器添加到来将转换器应用于所有类型的值
JsonSerializerSettings.Converters。并且,要在全球范围内注册这样的转换器,请参见例如,
如何在MVC 4 WebAPI中为Json.NET设置自定义JsonSerializerSettings?]
对于Web API, [设置JsonConvert.DefaultSettings as net net2.0无法 ASP.NET Core的
预期运行 ,或者_在Json.Net中_ 为控制台应用程序_全局注册了自定义JsonConverter_ 。
如果确实为控制台应用程序全局注册了转换器,则可能需要禁用它以进行递归调用,如
JSON中 所示。使用[JsonConvert()]时] ,Net会引发。
- 如果只需要 反
null
序列化Guid 的值而不必重新序列化,则可以将其应用于[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
Guid属性,null
尽管这些值是无效的Guid值,但这些值将被忽略:public class MyClass
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public Guid Property { get; set; }
}
"00000000-0000-0000-0000-000000000000"。为了改善这种情况,您可以应用[`DefaultValueHandling
DefaultValueHandling.Ignore`](https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_DefaultValueHandling.htm)它,这将导致在序列化期间忽略空的Guid值:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore)]public Guid Property { get; set; }
请注意,如果在反序列化期间调用的参数化构造函数具有相同名称的不可为空的Guid参数,则可能需要其他方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)