c# - 不为嵌套属性调用自定义 JsonConverter

标签 c# json json.net

我有一个 Employee 类,其中 Manager 属性本身是 Employee 类型

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Employee Manager { get; set; }
    public IList<string> Roles { get; set; }
}

我想为 Employee 类型创建自定义 JsonConverter。

public class TestJsonConverter : JsonConverter
{
    public TestJsonConverter()
    {
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        JToken t = JToken.FromObject(value);
        if (t.Type != JTokenType.Object)
        {
            t.WriteTo(writer);
        }
        else
        {
            JObject o = (JObject)t;
            IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList();
            o.AddFirst(new JProperty("Keys", new JArray(propertyNames)));
            o.WriteTo(writer);
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(Employee));
    }

    public override bool CanRead
    {
        get { return false; }
    }
}

ContractResolver 是

class ContractResolver : DefaultContractResolver
{
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);
        if (objectType == typeof(Employee))
        {
            contract.Converter = new TestJsonConverter();
        }
        return contract;
    }
}

当我尝试序列化 Employee 对象时,仅针对顶级 Employee 对象调用自定义 JsonConverter,而不是针对同样属于 Employee 类型的嵌套 Manager 属性:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new ContractResolver();
string json = JsonConvert.SerializeObject(employee, Formatting.Indented, settings);

最佳答案

我认为您遇到了中描述的相同问题 Custom JsonConverter WriteJson Does Not Alter Serialization of Sub-properties :

您的转换器未应用于您的子对象的原因是 JToken.FromObject() 在内部使用序列化程序的新实例,它不知道您的转换器。

所提供的解决方案应适合您的情况。

关于c# - 不为嵌套属性调用自定义 JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55119327/

相关文章:

c# - 使用C#检查运行进程的结果

c# - Xamarin.Forms Shared不在Android View 中显示图像,但在iOS View 中显示图像

JQuery $.getJSON 加载本地 JSON 文件不起作用

javascript - 未从工厂获取 JSON 数据

java - Elasticsearch java 顶级查询

c# - 将对象中的 Json 数组发送到 API

c# - 如何在 C# 中使用 PHP CLI

c# - 从 Active Directory 获取用户的管理员详细信息

c# - 从从 Instagram API 检索到的 JSON 字符串中检索 "images"

c# - 非根对象的 JSON 反序列化