Json.NET自定义JsonConverter被忽略

时间:2014-08-15 10:28:11

标签: c# asp.net-mvc json json.net

我有一个泛型类,我的孩子只想使用其中一个属性的值进行序列化。

为此,我编写了一个自定义JsonConverter并将其附加到具有JsonConverter(Type)属性的基类 - 但是,它似乎从未被调用过。作为参考,如下例所示,我使用List<>方法序列化System.Web.Mvc.Controller.Json()对象。

如果有更好的方法可以达到相同的结果,我绝对愿意接受建议。

实施例

查看功能

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": { ... } },
    ...
]

所需的输出

[
    { ... },
    { ... },
    { ... },
    ...
]

3 个答案:

答案 0 :(得分:7)

首先,System.Web.Mvc.Controller.Json()不能与Json.NET一起使用 - 它使用的JavaScriptSerializer 对你的Json.NET东西一无所知。如果您仍想使用System.Web.Mvc.Controller.Json()调用,则应执行this之类的操作。同时将WriteJson更改为:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    serializer.Serialize(writer, ((dynamic)value).attribute);
}

我认为这应该可以使您的代码正常工作。

答案 1 :(得分:2)

文件说: 要将JsonConverter应用于集合中的项,请使用JsonArrayAttribute,JsonDictionaryAttribute或JsonPropertyAttribute,并将ItemConverterType属性设置为要使用的转换器类型。

http://james.newtonking.com/json/help/html/SerializationAttributes.htm

也许这会有所帮助。

答案 2 :(得分:0)

发生了什么事,我按照Visual Studio的建议自动添加了using语句。并且错误地添加了using System.Text.Json.Serialization;而不是using Newtonsoft.Json;

所以我在目标类上使用了System.Text.Json.Serialization.JsonConverterAttribute。 (正确)被Json.Net忽略了。