当前位置: 首页 > 面试题库 >

Json.net反序列化null gui案例

袁秦迟
2023-03-14
问题内容

我正在反序列化使用的对象Json.NET,该对象包含Guid类型的私有字段和该字段的公共属性。当Guid我的json中的my的值为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;
            }
        }
    }
}

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

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

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


问题答案:

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); } }
    }
  1. 创建一个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); // 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会引发

  1. 如果只需要 null序列化Guid 的值而不必重新序列化,则可以将其应用于[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]Guid属性,null尽管这些值是无效的Guid值,但这些值将被忽略:
    public class MyClass
    

    {
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public Guid Property { get; set; }
    }

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参数,则可能需要其他方法



 类似资料:
  • 问题内容: 将对象反序列化为()时,嵌套对象反序列化为s。是否可以强制将嵌套对象反序列化为s? 问题答案: 我找到了一种通过提供实现将所有嵌套对象转换为的方法: 文档: Json.NET的CustomCreationConverter

  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当

  • 问题内容: 我有一堂课 我想将下面的JSON数据反序列化到上面的类/对象中 我的想法是在JSON中是一个对象,但我只想获取(在JSON中)在反序列化期间将像在类中那样传递。 如何使用Json.NET实现该目标? 我相信我可以使用CustomJsonConverter完成它。但是我很困惑。docs中的示例仅用于,但不适用。 问题答案: 我只是使用上面在问题中提到的方法解决了我的问题。在我完整的代码下

  • 问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将

  • 问题内容: 我正在尝试建立一个读取器,该读取器将从各种网站中接收JSON对象(考虑信息抓取)并将其转换为C#对象。我目前正在使用JSON.NET进行反序列化过程。我遇到的问题是它不知道如何处理类中的接口级属性。所以自然的东西: 会产生错误: 无法创建类型为IThingy的实例。类型是接口或抽象类,无法实例化。 相对于Thingy,让它成为IThingy相对重要,因为我正在处理的代码被认为是敏感的,

  • 本文向大家介绍C#使用Json.Net进行序列化和反序列化及定制化,包括了C#使用Json.Net进行序列化和反序列化及定制化的使用技巧和注意事项,需要的朋友参考一下 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程;在.Net阵营中,Json