反序列化空值JSON.net时抛出的null值异常

时间:2010-06-07 10:35:56

标签: .net json json.net

嗨朋友我试图将隐藏的控制字段反序列化为JSON对象,代码如下:

Dim settings As New Newtonsoft.Json.JsonSerializerSettings() 
settings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore
Return Newtonsoft.Json.JsonConvert.DeserializeObject(Of testContract)(txtHidden.Text, settings) 

但我收到以下异常。 value cannot be null parameter name s:我甚至添加了以下几行,但仍然无效。请帮忙。

settings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore
settings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
settings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace 

2 个答案:

答案 0 :(得分:7)

我有同样的错误信息,因为我尝试调用相同的方法。确保您的目标类(您的testContract类)有默认构造函数(没有参数的构造函数)。

在C#中,您的类和默认构造函数看起来像这样:

class testContract
{
    string StringProperty;
    int IntegerProperty;

    public testContract()
    {
        // This is your default constructor. Make sure this exists.
        // Do nothing here, or set default values for your properties
        IntegerProperty = -1;
    }

    public testContract(string StringProperty, int IntegerProperty)
    {
        // You can have another constructor that accepts parameters too.
        this.StringProperty = StringProperty;
        this.IntegerProperty = IntegerProperty;
    }
}

当JSON.net想要将JSON字符串反序列化为对象时,它首先使用其默认构造函数初始化对象,然后开始填充其属性。如果它没有找到默认构造函数,它将使用它可以找到的任何其他构造函数初始化对象,但它会将null传递给所有参数。

  

简而言之,你应该有一个默认的构造函数   目标类,或者,您的非默认构造函数必须能够处理   所有空参数。

答案 1 :(得分:0)

如果您使用[Serializable],您应该已经拥有默认的ctor,否则它不能成为数据绑定的一部分。结帐

  [JsonPropertyAttribute("jsonProp", Required=Required.Default)] 

该物业适合我

Newtonsoft必须使用方法

Parse - 将解析部分数据 和 反序列化 - 将解析整个数据

如果您希望使用部分数据,例如在其网站上的示例中,请使用Parse。

如果您希望使用反序列化,您需要确保所有属性都存在并且标记为默认,如上所述。