有没有一种方法可以为每个对象编写自定义JsonConverter
本文关键字:对象 JsonConverter 自定义 一种 方法 有没有 | 更新日期: 2023-09-27 18:27:54
我有一个Json对象,如下所示:
{"company": "My Company",
"companyStart" : "2015/01/01",
"employee" :
{ "name" : "john doe",
"startDate" : 1420434000000 } }
我的json对象是这样的:
public class Company {
public string company;
public DateTime companyStart;
public Employee employee;
}
public class Employee {
public string name;
public DateTime startDate;
}
我的原始代码像这样反序列化
JsonConvert.DeserializeObject<Company>(jsonString);
这段代码转换Company.companyStart没有问题,但当它到达Employee.startDate时,它不知道如何处理Long。
这篇文章向我展示了如何创建自定义JsonConverter来将long转换为DateTime,但正如你在我的案例中看到的那样,这会给我在将Company.companyStart转换为DateTime时带来麻烦。
所以。。。我想做这样的事情:
public class Company : JsonBase {
...
}
public class Employee : JsonBase {
...
Employee() { Converter = new CustomDateConverter(); }
}
public class JsonBase {
private JsonConverter converter;
[JsonIgnore]
public JsonConverter Converter => converter ?? (converter = new StandardConverter());
}
JsonBase将包含标准转换器或
在我的代码中,我会转换这样的东西:
public T CreateJsonObject<T>() where T : JsonBase {
JsonBase json = (T) Activator.CreateInstance(typeof (T));
JsonConvert.DeserializeObject<T>(jsonString, json.Converter);
}
问题是,这并不完全有效,因为这种方法只会使用最顶部的Converter来转换所有内容,而不是使用每个对象的Converter。
有没有办法对每个对象使用转换器?或者也许有更好的方法可以做到这一点。
如何调整您编写的自定义转换器以理解这两种格式:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.ValueType == typeof(string))
{
return DateTime.Parse((string)reader.Value);
}
else if (reader.ValueType == typeof(long))
{
return new DateTime(1970, 1, 1).AddMilliseconds((long)reader.Value);
}
throw new NotSupportedException();
}
或者,您可以通过使用JsonConverter
属性装饰转换器,将转换器仅应用于模型的特定属性:
public class Employee
{
public string name;
[JsonConverter(typeof(MyConverter))]
public DateTime startDate;
}
这样,您就不需要全局注册转换器,也不会与其他标准日期格式发生冲突。