有没有一种方法可以为每个对象编写自定义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。

有没有办法对每个对象使用转换器?或者也许有更好的方法可以做到这一点。

有没有一种方法可以为每个对象编写自定义JsonConverter

如何调整您编写的自定义转换器以理解这两种格式:

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;
}

这样,您就不需要全局注册转换器,也不会与其他标准日期格式发生冲突。