是否可以限制在属性上注册的JsonConverter仅在模型绑定期间运行?

arknldoa  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(67)

我有一个Web API应用程序,它服务于一个端点:POST: /api/Partition,并接受一个具有以下结构的JSON对象:

{
    // myProperty is a string array
    myProperty: [ "a", "b" ]
}

字符串
但是,相应的WebAPI控制器操作接受具有以下结构的类:

[HttpPost]
public ActionResult<MyClass> Post(MyClass postObject)
{
    ...
}

public class MyClass 
{
    public string MyProperty { get; set;}
}


我需要将MyProperty从string[]转换为string。因此,我编写了此自定义JsonConverter并将其注册到MyProperty

public class StringToStringArrayJsonConverter : JsonConverter<string>
{
    public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.StartArray)
        {
            List<string> list = new List<string>();
            reader.Read();
            while (reader.TokenType != JsonTokenType.EndArray)
            {
                list.Add(JsonSerializer.Deserialize<string>(ref reader, options)!);
                reader.Read();
            }
            return string.Join(",", list);
        }
        return reader.GetString();
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
    {
        writer.WriteStartArray();
        writer.WriteStringValue(value);
        writer.WriteEndArray();
    }

    public override bool CanConvert(Type typeToConvert)
    {
        return true;
    }
}

// Register JsonConverter on MyProperty
public class MyClass 
{
    [JsonConverter(typeof(StringToStringArrayJsonConverter))]
    public string MyProperty { get; set;}
}


然而,我希望这个JsonConverter只在模型绑定期间在控制器操作运行之前生效。现在,每当我使用JsonSerializer.Serialize()JsonSerializer.Deserialize()时,它也会被使用,我不希望发生这种情况。当我想使用JsonSerializer时,我如何覆盖注册的JsonConverter?

qpgpyjmq

qpgpyjmq1#

最好不要覆盖jsonconverter类,因为类配置中有一些标准。
你遇到的问题是,你应该与控制器输出数据在同一个规则上,所以你的函数最好为你的MyClass类使用getter-setter。
在setter中你可以得到想要的值,在getter中你可以返回它。

相关问题