JSON.net:如何在不使用默认构造函数的情况下反序列化?

我有一个具有默认构造函数的类,还有一个带有一组参数的重载构造函数。这些参数与对象上的字段匹配,并在构造时分配。此时,我需要将默认构造函数用于其他目的,因此,如果可以的话,我想保留它。

我的问题:如果删除默认构造函数并传递JSON字符串,则该对象将正确反序列化并传入构造函数参数,而不会出现任何问题。我最终以我期望的方式取回了对象。但是,一旦我将默认构造函数添加到对象中,当我调用JsonConvert.DeserializeObject<Result>(jsontext)该属性时,就不再填充这些属性。

在这一点上,我已经尝试添加new JsonSerializerSettings(){CheckAdditionalContent =

true}反序列化调用。那什么也没做。

另一个说明。除了参数以小写字母开头外,contructor参数确实与字段名称完全匹配。我认为这并不重要,因为就像我提到的那样,反序列化可以在没有默认构造函数的情况下正常工作。

这是我的构造函数的一个示例:

public Result() { }

public Result(int? code, string format, Dictionary<string, string> details = null)

{

Code = code ?? ERROR_CODE;

Format = format;

if (details == null)

Details = new Dictionary<string, string>();

else

Details = details;

}

回答:

如果有一个对象,Json.Net倾向于在对象上使用默认的(无参数)构造函数。如果存在多个构造函数,并且您希望Json.Net使用非默认[JsonConstructor]构造函数,则可以将属性添加到希望Json.Net调用的构造函数中。

[JsonConstructor]

public Result(int? code, string format, Dictionary<string, string> details = null)

{

...

}

重要的是,构造函数参数名称必须与JSON对象的相应属性名称匹配(忽略大小写),才能正常工作。但是,不必一定要为对象的每个属性都具有构造函数参数。对于那些构造函数参数未涵盖的JSON对象属性,Json.Net将[JsonProperty]在构造对象后尝试使用公共属性访问器(或标有的属性/字段)填充对象。

如果您不想在类中添加属性,或者不希望控制试图反序列化的类的源代码,那么另一种选择是创建一个自定义JsonConverter来实例化并填充您的对象。例如:

class ResultConverter : JsonConverter

{

public override bool CanConvert(Type objectType)

{

return (objectType == typeof(Result));

}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)

{

// Load the JSON for the Result into a JObject

JObject jo = JObject.Load(reader);

// Read the properties which will be used as constructor parameters

int? code = (int?)jo["Code"];

string format = (string)jo["Format"];

// Construct the Result object using the non-default constructor

Result result = new Result(code, format);

// (If anything else needs to be populated on the result object, do that here)

// Return the result

return result;

}

public override bool CanWrite

{

get { return false; }

}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

{

throw new NotImplementedException();

}

}

然后,将转换器添加到序列化程序设置中,并在反序列化时使用这些设置:

JsonSerializerSettings settings = new JsonSerializerSettings();

settings.Converters.Add(new ResultConverter());

Result result = JsonConvert.DeserializeObject<Result>(jsontext, settings);

以上是 JSON.net:如何在不使用默认构造函数的情况下反序列化? 的全部内容, 来源链接: utcz.com/qa/401158.html

回到顶部