Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 能否扩展JSON.NET中用于集合的默认JsonConverter?_C#_Json.net_Base Class_Default Implementation - Fatal编程技术网

C# 能否扩展JSON.NET中用于集合的默认JsonConverter?

C# 能否扩展JSON.NET中用于集合的默认JsonConverter?,c#,json.net,base-class,default-implementation,C#,Json.net,Base Class,Default Implementation,我正在尝试编写一个自定义JsonConverter,用于一个人对列表或集合进行子类化,然后向子类添加额外属性的情况(请参阅)。当前的JSON.NET实现只是将列表更改为子对象数组,并忽略所有添加的属性。因此,我想编写一个新的JsonConverter,它将对象视为一个列表,并将其他所有内容正常序列化,然后在存储实际数据数组的序列化中添加一个名为“_Items”的新属性 现在,我已经为我们的特定列表子类编写了一个类,该类正好可以这样做,但是我必须逐个手动指定所有属性。但是如果我能写一个转换器,把它

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

现在,我已经为我们的特定列表子类编写了一个类,该类正好可以这样做,但是我必须逐个手动指定所有属性。但是如果我能写一个转换器,把它当作一个普通的对象,然后手动处理这些项目,我会很高兴。我甚至不在乎是否会复制另一个类的一半(甚至更多!),但我希望为这些情况制作一个可重用的转换器。然而,正如我所说,我找不到默认的转换器来启动


所以。。。有人知道它在哪里吗?

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

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

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

,您可以覆盖
CanRead
CanWrite
以返回
false
并为您的属性注册
customasdefaultconverter: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类AsDefaultConverter:JsonConverter
{
公共重写JObject ReadJson(JsonReader阅读器,类型objectType,JObject existingValue,bool hasExistingValue,JsonSerializer序列化程序)
{
抛出新的NotImplementedException();
}
公共重写void WriteJson(JsonWriter编写器、JObject值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
公共覆盖boolcanwrite=>false;
public override bool CanRead=>false;
}
MyModel:

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; }
} 
公共类MyModel
{
/// 
///获取或设置事件id
/// 
公共字符串EventId{get;set;}
/// 
///获取或设置触发器名称
/// 
公共字符串名称{get;set;}
/// 
///获取或设置参数
/// 
[JsonConverter(typeof(AsDefaultConverter))]
公共JObject参数{get;set;}
/// 
///获取或设置触发器创建日期
/// 
已创建公共DateTimeOffset{get;set;}
/// 
///获取或设置触发器创建者
/// 
公共用户CreatedBy{get;set;}
} 

在startUp registration中,我已经覆盖了自定义的默认JsonSerialization,但是对于属性
JObject参数
,我已经指定了本例中需要的转换器。

看不太清楚我在寻找什么,但它确实让我知道了如何去做。