我有一个类,它有一个默认构造函数和一个接受一组参数的重载构造函数。这些参数与对象上的字段匹配,并在构造时分配。此时我需要默认构造函数用于其他目的,所以如果可以的话我想保留它。
我的问题:如果我删除默认构造函数并传入 JSON 字符串,对象将正确反序列化并传入构造函数参数而不会出现任何问题。我最终以我期望的方式取回了填充的对象。但是,一旦我将默认构造函数添加到对象中,当我调用 JsonConvert.DeserializeObject<Result>(jsontext)
时不再填充属性。
此时我尝试添加 new JsonSerializerSettings(){CheckAdditionalContent = true}
到反序列化调用。那没有做任何事情。
另一个注意事项:除了参数以小写字母开头外,构造函数参数确实与字段名称完全匹配。我认为这无关紧要,因为正如我提到的,反序列化在没有默认构造函数的情况下工作正常。
这是我的构造函数的示例:
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会在构造对象后尝试使用公共(public)属性访问器(或标有[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);
关于c# - JSON.net:如何在不使用默认构造函数的情况下反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35615905/