gpt4 book ai didi

.net - 通过属性指定的转换器与 json.net 中的全局转换器等效

转载 作者:行者123 更新时间:2023-12-03 02:52:48 24 4
gpt4 key购买 nike

何时 using Newtonsoft.Json ,我可以通过在顶层添加转换器 SerializerSettings 来让它完成我需要的操作或将其提供给转换调用 - 一切正常。

我希望提取一些全局转换器,以便在实际需要转换的相关位置以声明方式应用。

我知道以下技术:-

  • 类型级别 [JsonConverter(typeof(Converters.StringEnumConverter))]直接输入X
  • 成员(member)级别 [JsonConverter(typeof(Converters.StringEnumConverter))] iff 成员的类型为 X
  • 项目级别 [JsonProperty(ItemConverterType=typeof(Converters.StringEnumConverter)]如果该成员实际上是 X 的数组等

我遇到的问题是我正在使用的一些全局转换器对嵌套类型进行操作,例如如果我有 Tuple<X[],Nullable<X>> 类型的成员,我无法表达“如果在处理此字段或其任何子字段时遇到 X,请执行转换”语义,而是得到 Newtonsoft.Json.JsonSerializationException .

这样的“对于这棵树,也请使用这个转换器”机制是否存在?我想避免必须为我想要转换的任何内容定义顶级类型,然后使用 JsonConverter 标记该类型。解决这个问题?

最佳答案

如果我理解正确并且根据官方文档,您可以直接应用转换器并使用自定义转换器按类型过滤:

SomeType someObject = new SomeType();
string json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new MyCustomConverter(typeof(SomeType)));

public class MyCustomConverter : JsonConverter
{

private readonly Type[] _types;

public MyCustomConverter (params Type[] types)
{
_types = types;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value);

if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
JObject o = (JObject)t;
IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList();

o.AddFirst(new JProperty("Keys", new JArray(propertyNames)));

o.WriteTo(writer);
}
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override bool CanRead
{
get { return false; }
}

public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == objectType);
}
}

来源:https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm

关于.net - 通过属性指定的转换器与 json.net 中的全局转换器等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51077670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com