【问题标题】:ASP.NET Web-API not serializing readonly propertyASP.NET Web-API 不序列化只读属性
【发布时间】:2012-03-11 23:19:27
【问题描述】:

我将 API 方法从标准 MVC 操作迁移到新的 asp.net Web-API beta,突然一个只读属性不再序列化(两者都返回 JSON)。这是预期的行为吗?

编辑:添加代码示例

我通过 nuget 包引用了 Newtonsoft.Json 4.0.8 和 System.Json 4.0

        public IQueryable<Car> Gets()
        {
             return _carRepository.GetCars();
        }

        public class Car
        {
            public IEnumerable<Photo> Photos
            {
                get { return _photos; }
            }

            public string PreviewImageUrl // No longer serialized
            {
                get
                {
                     var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault();
                        return mainImage != null ? mainImage.Url : (string.Empty);
                    }
                }
             }
         }

【问题讨论】:

  • 不是预期的。你能发布一些重现问题的代码吗?
  • 您使用的是哪个 JSON 序列化程序?

标签: asp.net-mvc asp.net-web-api


【解决方案1】:

Beta 附带的JsonMediaTypeFormatter 使用不支持只读属性的序列化程序(因为它们不能正确往返)。我们计划在下一个 realese 解决这个问题。

同时,您可以使用自定义 JSON MediaTypeFormatter 实现,该实现使用 Json.NET(有一个可用的 here)代替内置格式化程序。

更新:还可以查看 Henrik 关于连接 JSON.NET 格式化程序的博客:http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

【讨论】:

  • 刚刚升级到 RC 版本,这似乎仍然是个问题。只是好奇在最终发布之前情况是否会发生变化,还是我们不应该期望只读属性被序列化?谢谢!
  • 您可以尝试最新的夜间构建(说明:aspnetwebstack.codeplex.com/discussions/353867)。此外,请确保您确实从系统中卸载了 Beta 位。如果它仍然是一个问题,你可以在这里发布一个重现:aspnetwebstack.codeplex.com。谢谢。
  • 我已经卸载了 beta 并安装了 RC,但忽略了用 nuget 更新我的项目的包,所以我仍然使用 beta 位。更新后,只读属性使用 JSON 序列化,而不是 XML。就我的目的而言,我只需要 JSON,所以我很好,但它似乎应该与 XML 序列化表现相同?
【解决方案2】:

我不知道这是否是预期的行为。我会说这对于输入参数是预期的(因为您无法设置它们的值),但对于输出参数则不是。所以我会说这是一个输出参数的错误。这是一个说明问题的示例:

型号:

public class Product
{
    public Product()
    {
        Prop1 = "prop1 value";
        Prop2 = "prop2 value";
        Prop3 = "prop3 value";
    }

    public string Prop1 { get; set; }

    [ReadOnly(true)]
    public string Prop2 { get; set; }

    public string Prop3 { get; protected set; }
}

控制器:

public class ProductsController : ApiController
{
    public Product Get(int id)
    {
        return new Product();
    }
}

请求:

api/products/5

结果:

{"Prop1":"prop1 value","Prop2":"prop2 value"}

因此,如果该属性没有公共设置器,则它不会被序列化,这似乎不正常,因为在这种情况下,Product 类被用作输出。

我建议打开一个连接票,以便 Microsoft 可以在发布之前修复此问题,或者至少说明这是设计使然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多