2012-02-21 77 views
6

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

编辑:添加代码示例

我都Newtonsoft.Json 4.0.8和4.0 System.Json通过的NuGet包引用

 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); 
        } 
       } 
      } 
     } 
+0

预计不会。你可以发布一些代码来重现这个问题。 – marcind 2012-02-21 16:57:16

+0

您正在使用哪个JSON序列化程序? – 2012-02-22 01:22:17

回答

10

Beta附带的JsonMediaTypeFormatter使用不支持只读属性的序列化程序(因为它们不会正确地往返)。我们正计划在下一次会议上讨论这个问题。

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

更新:还检查了Henrik的约挂钩一个JSON.NET格式化博客:http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

+1

刚刚升级到RC版本,这似乎仍然是一个问题。只是好奇,如果事情会在最终版本发布之前发生变化,或者我们不希望只读属性被序列化?谢谢! – 2012-06-07 18:04:43

+0

您可以尝试最新的每晚构建(说明:http://aspnetwebstack.codeplex.com/discussions/353867)。另外,请确保您实际上卸载了系统中的Beta位。如果这仍然是一个问题,你可以在这里发布repro:http://aspnetwebstack.codeplex.com/。谢谢。 – marcind 2012-06-07 18:37:39

+0

我已经卸载了测试版并安装了RC,但忽略了用nuget更新我的项目包,所以我仍在使用beta位。更新后,只读属性使用JSON序列化,但不是以XML格式。对我而言,JSON是我所需要的,所以我很好,但它看起来应该与XML序列化相同? – 2012-06-08 13:26:41

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"} 

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

我会建议打开一个连接票,以便微软可以在发布之前解决这个问题,或者至少告诉你这是通过设计。