首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >你能为集合扩展JSON.NET中使用的默认JsonConverter吗?

你能为集合扩展JSON.NET中使用的默认JsonConverter吗?
EN

Stack Overflow用户
提问于 2011-05-04 17:03:44
回答 3查看 10.5K关注 0票数 26

我正在尝试编写一个自定义的JsonConverter,用于这样的情况:一个人对列表或集合进行子类化,然后向子类添加额外的属性(参见)。当前的JSON.NET实现只是将列表更改为子对象的数组,并忽略所有添加的属性。因此,我想要编写一个新的JsonConverter,它将对象视为不是列表,而只是像往常一样序列化其他所有内容,然后在序列化中添加一个名为'_Items‘的新属性,其中存储了实际的数据数组。

现在,我已经为我们的特定List子类编写了一个类,但我必须逐个手动指定所有属性。但是,如果我可以编写一个转换器,将其视为普通对象,然后手动处理这些项,那我就是金子了。我甚至不关心我是否最终复制了另一个类的一半(甚至更多!)但我很乐意为这些情况做一个可重用的转换器。但是,正如我所说的,我找不到可以开始的默认转换器。

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

EN

回答 3

Stack Overflow用户

发布于 2013-09-12 03:59:03

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

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

我还没有找到一种方法(正确的方法或优雅的技巧)来使用实体上的扩展自定义序列化(我假设您正在尝试这样做)来执行泛型协定序列化(例如:像正常一样解析对象)。

票数 16
EN

Stack Overflow用户

发布于 2019-08-17 12:12:42

As @dbc said here,您可以重写CanReadCanWrite以返回false并为您的属性注册CustomAsDefaultConvertor : JsonConverter

我的案例:

代码语言:javascript
复制
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;
}

MyModel:

代码语言:javascript
复制
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; }
} 

在startUp注册中,我覆盖了自定义的默认JsonSerialization,但对于属性JObject Arguments,我指定了本例中所需的转换器。

票数 3
EN

Stack Overflow用户

发布于 2021-12-27 07:06:18

不确定何时以及这是否是答案,但有一个似乎用于在内部获取JsonSerializerSettings的属性JsonConvert.DefaultSettings

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5881028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档