【问题标题】:Can you extend the default JsonConverter used in JSON.NET for collections?您可以扩展 JSON.NET 中用于集合的默认 JsonConverter 吗?
【发布时间】:2011-08-18 08:54:11
【问题描述】:

我正在尝试编写一个自定义 JsonConverter 来处理一个人对列表或集合进行子类化,但随后向子类添加额外属性的情况(请参阅here)。 JSON.NET 的当前实现只是将列表更改为子对象数组并忽略所有添加的属性。所以我想写一个新的 JsonConverter 来处理对象,就好像它 不是 一个 List 并像正常一样序列化其他所有内容,然后在序列化中添加一个名为“_Items”的新属性存储实际数据数组的位置。

现在我已经为我们的特定 List 子类编写了一个完全执行此操作的类,但是我必须手动一个一个地指定所有属性。但是,如果我可以编写一个将其视为普通对象的转换器,然后手动处理这些项目,我会很高兴。我什至不在乎我是否最终会复制另一个课程的一半(甚至更多!),但我很乐意为这些案例制作一个可重复使用的转换器。但是,正如我所说,我找不到默认的转换器。

所以...有人知道那在哪里吗?

【问题讨论】:

标签: c# json.net base-class default-implementation


【解决方案1】:

JSON.NET 中没有“默认转换器”。

如果您能够检查JsonSerializerInternalWriter 类,请查看SerializeValue 方法。其中,顶部有“转换器查找和执行”阶段。但是,如果没有匹配的转换器,它会求助于合约类型序列化(switch 语句)。

我还没有找到一种方法(正确的方法或优雅的 hack)能够使用实体上的扩展自定义序列化(我假设你正在尝试做)。

【讨论】:

    【解决方案2】:

    As @dbc said here,您可以覆盖CanRead 和CanWrite 以返回false 并为您的属性注册CustomAsDefaultConvertor : JsonConverter。

    我的情况:

    public class AsDefaultConverter : JsonConverter<JObject>
    {
        public override JObject ReadJson(JsonReader reader, Type objectType, JObject existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    
        public override void WriteJson(JsonWriter writer, JObject value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    
        public override bool CanWrite => false;
    
        public override bool CanRead => false;
    }
    

    我的模特:

    public class MyModel
    {
        /// <summary>
        /// Gets or sets event id
        /// </summary>
        public string EventId { get; set; }
    
        /// <summary>
        /// Gets or sets trigger name
        /// </summary>
        public string Name { get; set; }
    
        /// <summary>
        /// Gets or sets arguments
        /// </summary>
        [JsonConverter(typeof(AsDefaultConverter))]
        public JObject Arguments { get; set; }
    
        /// <summary>
        /// Gets or sets trigger creation date
        /// </summary>
        public DateTimeOffset Created { get; set; }
    
        /// <summary>
        /// Gets or sets trigger creator
        /// </summary>
        public User CreatedBy { get; set; }
    } 
    

    在启动注册时,我已经覆盖了自定义的默认 JsonSerialization,但是对于属性 JObject Arguments,我已经指定了在这种情况下我需要的转换器。

    【讨论】:

      【解决方案3】:

      不确定从什么时候开始,如果这是答案,但有属性 JsonConvert.DefaultSettings 似乎用于在内部获取 JsonSerializerSettings

      https://www.newtonsoft.com/json/help/html/DefaultSettings.htm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        相关资源
        最近更新 更多