嗨朋友我试图将隐藏的控制字段反序列化为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
答案 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。
如果您希望使用反序列化,您需要确保所有属性都存在并且标记为默认,如上所述。