将 JSON 对象绑定到核心 ASP.NET 列表



我目前正在将API从 ASP.NET Web API迁移到 ASP.NET Core。我的旧 API 有一个端点接受列表作为正文的一部分:

public IHttpActionResult Post(MyModel model)
{
...
}
public class MyModel
{
public List<SomeObject> SomeObjects { get; set; }
}

我有一些这个API的消费者能够发布以下JSON:

POST /post
{
"someObjects": {}
}

当然,这应该是:

POST /post
{
"someObjects": []
}

但是 ASP.NET Web API 模型绑定接受了这一点(我猜someObjects设置为null"(。

对 ASP.NET Core 执行相同操作时,在将相同的 JSON 发布到 API 时出现以下错误:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[SomeObject]'

同样,我完全理解为什么会出现错误。我需要向后兼容,所以有人可以帮忙吗?我想我需要一个自定义模型绑定器或其他东西来允许将空对象转换为null或空列表?

这不是一个干净的解决方案,但您可以为List<SomeObject>编写自定义JsonConverter,并在不是列表时返回 null 或空列表:

public class CustomConverter : JsonConverter<List<SomeObject>>
{
public override List<SomeObject> ReadJson(JsonReader reader, Type objectType, List<SomeObject> existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
{
return token.ToObject<List<SomeObject>>();
}
return null;
}
public override void WriteJson(JsonWriter writer, List<SomeObject> value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
public class MyModel
{
[JsonConverter(typeof(CustomConverter))]
public List<SomeObject> SomeObjects { get; set; }
}

最新更新