6

我将 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);
                    }
                }
             }
         }
4

2 回答 2

10

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

同时,您可以使用自定义 JSONMediaTypeFormatter实现,该实现使用 Json.NET(这里有一个而不是内置格式化程序。

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

于 2012-02-23T00:47:01.370 回答
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因为在这种情况下,该类被用作输出。

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

于 2012-02-21T22:37:05.993 回答