26

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

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

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

4

3 回答 3

16

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

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

我还没有找到一种方法(正确的方法或优雅的 hack)能够使用实体上的扩展自定义序列化(我假设您正在尝试)执行通用合同序列化(例如:正常解析对象)做)。

于 2013-09-11T19:59:02.503 回答
3

正如@dbc 所说,您可以覆盖CanReadCanWrite返回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我已经指定了在这种情况下需要的转换器。

于 2019-08-17T04:12:42.290 回答
0

不知道从什么时候开始,如果这是答案,但有JsonConvert.DefaultSettings一些似乎用于JsonSerializerSettings内部获取的属性

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

于 2021-12-27T07:06:18.463 回答