ASP.NET Web-API不序列化readonly属性

时间:2012-02-21 16:20:30

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

我将API方法从标准MVC操作迁移到新的asp.net Web-API测试版,突然只读取属性不再序列化(都返回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);
                    }
                }
             }
         }

2 个答案:

答案 0 :(得分:10)

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

在平均时间内,您可以使用自定义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

答案 1 :(得分:4)

我不知道这是否是预期的行为。我会说这是输入参数(因为你不能设置它们的值)而不是输出参数。所以我想说这是输出参数的错误。这是一个说明问题的例子:

型号:

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可以在发布之前修复此问题,或者至少告诉这是设计的。