我正在尝试编写一个自定义的JsonConverter,用于这样的情况:一个人对列表或集合进行子类化,然后向子类添加额外的属性(参见)。当前的JSON.NET实现只是将列表更改为子对象的数组,并忽略所有添加的属性。因此,我想要编写一个新的JsonConverter,它将对象视为不是列表,而只是像往常一样序列化其他所有内容,然后在序列化中添加一个名为'_Items‘的新属性,其中存储了实际的数据数组。
现在,我已经为我们的特定List子类编写了一个类,但我必须逐个手动指定所有属性。但是,如果我可以编写一个转换器,将其视为普通对象,然后手动处理这些项,那我就是金子了。我甚至不关心我是否最终复制了另一个类的一半(甚至更多!)但我很乐意为这些情况做一个可重用的转换器。但是,正如我所说的,我找不到可以开始的默认转换器。
所以..。有人知道那是哪里吗?
发布于 2013-09-12 03:59:03
JSON.NET中没有“默认转换器”。
如果能够检查JsonSerializerInternalWriter类,请查看SerializeValue
方法。在它的顶部有“转换器查找和执行”阶段。但是,如果没有匹配的转换器,它将求助于协定类型序列化( switch语句)。
我还没有找到一种方法(正确的方法或优雅的技巧)来使用实体上的扩展自定义序列化(我假设您正在尝试这样做)来执行泛型协定序列化(例如:像正常一样解析对象)。
发布于 2019-08-17 12:12:42
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;
}
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; }
}
在startUp注册中,我覆盖了自定义的默认JsonSerialization,但对于属性JObject Arguments
,我指定了本例中所需的转换器。
发布于 2021-12-27 07:06:18
不确定何时以及这是否是答案,但有一个似乎用于在内部获取JsonSerializerSettings
的属性JsonConvert.DefaultSettings
https://www.newtonsoft.com/json/help/html/DefaultSettings.htm
https://stackoverflow.com/questions/5881028
复制相似问题