我有一个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?
1条答案
按热度按时间qpgpyjmq1#
最好不要覆盖jsonconverter类,因为类配置中有一些标准。
你遇到的问题是,你应该与控制器输出数据在同一个规则上,所以你的函数最好为你的MyClass类使用getter-setter。
在setter中你可以得到想要的值,在getter中你可以返回它。