【问题标题】:Binding JSON object to list in ASP.NET Core将 JSON 对象绑定到 ASP.NET Core 中的列表
【发布时间】:2019-09-12 07:07:33
【问题描述】:

我目前正在将一个 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 模型绑定接受了这个(我猜是设置 someObjectsnull `)。

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

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

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

【问题讨论】:

  • 不知道答案,但也许我可以为您指明设置自己的方向JsonSerializerSettingsnewtonsoft.com/json/help/html/…
  • 我猜想将 someObjects 设置为 null` 这是当前的实际行为吗?
  • 不,当前的行为是请求失败并出现我在问题中发布的错误。
  • 我的意思是“遗留”行为;您的 ASPNET WebApi 上的属性是否设置为 null?
  • 我不记得了。这里的问题不是 ASP.NET Web API。我只是想允许{} 作为List&lt;SomeObject 的有效值。如果是null 或者 ASP.NET Core 中的空列表,我可以在新版本中处理。

标签: c# asp.net-core


【解决方案1】:

这不是一个干净的解决方案,但您可以为 List&lt;SomeObject&gt; 编写自定义 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; }
}

【讨论】:

  • 我已经使用您的代码解决了这个问题,但没有例外地实现了ReadJson 方法。如果您允许,我会更新您的代码并将其标记为答案?
  • 当然,我只是懒得实施最佳解决方案 :)
猜你喜欢
  • 2020-03-14
  • 2023-02-04
  • 2014-08-15
  • 2014-02-25
  • 2010-10-14
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多