Json.. NET自定义json转换器被忽略
本文关键字:转换器 json NET 自定义 Json | 更新日期: 2023-09-27 18:18:12
我有一个泛型类,我想用它的一个属性值序列化它的子类。
为此,我编写了一个自定义的JsonConverter
,并使用JsonConverter(Type)
属性将其附加到基类-然而,它似乎从未被调用过。作为参考,如下例所示,我正在使用System.Web.Mvc.Controller.Json()
方法序列化对象的List<>
。
如果有更好的方法可以达到同样的结果,我绝对愿意接受建议。
示例<
视图函数/strong>
public JsonResult SomeView()
{
List<Foo> foos = GetAListOfFoos();
return Json(foos);
}
自定义JsonConverter
class FooConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
System.Diagnostics.Debug.WriteLine("This never seems to be run");
// This probably won't work - I have been unable to test it due to mentioned issues.
serializer.Serialize(writer, (value as FooBase<dynamic, dynamic>).attribute);
}
public override void ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
System.Diagnostics.Debug.WriteLine("This never seems to be run either");
return objectType.IsGenericType
&& objectType.GetGenericTypeDefinition() == typeof(FooBase<,>);
}
}
Foo基类
[JsonConverter(typeof(FooConverter))]
public abstract class FooBase<TBar, TBaz>
where TBar : class
where TBaz : class
{
public TBar attribute;
}
Foo实施
public class Foo : FooBase<Bar, Baz>
{
// ...
}
电流输出
[
{"attribute": { ... } },
{"attribute": { ... } },
{"attribute": { ... } },
...
]
期望输出值
[
{ ... },
{ ... },
{ ... },
...
]
发生在我身上的是,我根据Visual Studio的建议自动添加了using
语句。误加using System.Text.Json.Serialization;
而不是using Newtonsoft.Json;
所以我在目标类上使用System.Text.Json.Serialization.JsonConverterAttribute
。
首先System.Web.Mvc.Controller.Json()不支持Json。. NET -它使用JavaScriptSerializer,它对你的Json一无所知。净的东西。如果你仍然想使用System.Web.Mvc.Controller.Json()调用,你应该这样做。同时将WriteJson
改为:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, ((dynamic)value).attribute);
}
文档说明:要将JsonConverter应用于集合中的项,请使用JsonArrayAttribute, JsonDictionaryAttribute或JsonPropertyAttribute,并将ItemConverterType属性设置为您想要使用的转换器类型。
http://james.newtonking.com/json/help/html/SerializationAttributes.htm也许会有帮助。