2012-02-21 73 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類被用作輸出在這種情況下。

我會建議打開一個連接票,以便微軟可以在發佈之前解決這個問題,或者至少告訴你這是通過設計。