2013-12-11 41 views
4

我有一個POCO類,它從幾個類繼承,爲它提供INotifyPropertyChanged和DataAnnotations支持。當的WebAPI返回法院的一個實例中,串行器JSON.NET在ModelPropertyAnnotationsValidation匿名方法委託扼流圈與一個異常(示出從Fiddler中RAW響應):WebApi中的JSON.NET序列化錯誤

{「消息」:「發生錯誤。 「,」ExceptionMessage「:」 'ObjectContent`1'類型未能序列化響應正文 內容類型'application/json; charset = utf-8'。「,」ExceptionType「:」System.InvalidOperationException 「,」StackTrace「:null,」InnerException「:{」Message「:」發生了 錯誤。「,」ExceptionMessage「:」從 獲取值時出錯「CS $ <> 9_ CachedAnonymousMethodDelegate5' 上 'Sample.Data.Models.Court' 「」 ExceptionType。 「:」 Newtonsoft.Json.JsonSerializationException 「 」堆棧跟蹤「:」 在Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(對象 靶個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter 作家,對象的值,JsonContainerContract合同,JsonProperty 構件,JsonProperty屬性,JsonContract & memberContract,對象& memberValue個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer,Object va略,JsonObjectContract合同,JsonProperty 構件,JsonContainerContract collectionContract,JsonProperty containerProperty個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter 作家,對象的值,JsonContract valueContract,JsonProperty構件, JsonContainerContract containerContract,JsonProperty containerProperty個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(jsonWriter jsonWriter,對象的值)\ r \ n在 Newtonsoft.Json.JsonSerializer.SerializeInternal(jsonWriter jsonWriter,對象的值)\ r \ n at System.Net.Http.Formatting.JsonMediaTypeFormatter。 <>Ç _DisplayClassd.b_ C(個)\ r \ n 在System.Threading.Tasks.TaskHelpers.RunSynchronously(動作的動作, 的CancellationToken令牌) 「 」的InnerException「:{ 」消息「:」 一個錯誤已 發生 「」ExceptionMessage。「:」 通用語言運行時檢測到 無效 節目 「, 」ExceptionType「: 」System.InvalidProgramException「, 」堆棧跟蹤「:」 在GetCS $ <> 9 _CachedAnonymousMethodDelegate5(對象) \ r \ n在 Newtonsoft.Json.Serialization.DynamicValueProvider。的GetValue(對象 目標)「}}}

法院類(節錄爲了簡潔):

using System; 
using System.Collections.Generic; 
using Sample.Data.Models.Infrastructure; 

namespace Sample.Data.Models 
{ 
    [Serializable] 
    public partial class Court : ModelPropertyAnnotationsValidation 
    { 
     public Court() 
     { 
     } 

     private int _courtID; 
     public int CourtID 
     { 
      get { return _courtID; } 
      set 
      { 
       _courtID = value; 
       OnPropertyChanged(() => CourtID); 
      } 
     } 
    } 
} 

這裏是繼承抽象類,其中的問題所在(如果我改變對public string this[string columnName]吸氣劑返回一個空字符串,它的工作原理:

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 

namespace Sample.Data.Models.Infrastructure 
{ 
    public abstract class ModelPropertyAnnotationsValidation : ModelBase 
    { 
     public string this[string columnName] 
     { 
      get 
      { 
       var type = GetType(); 
       var modelProperties = TypeDescriptor.GetProperties(type).Cast<PropertyDescriptor>(); 

       var enumerable = from modelProperty in modelProperties.Where(modelProp => modelProp.Name == columnName) 
           from attribute in modelProperty.Attributes.OfType<ValidationAttribute>().Where(attribute => !attribute.IsValid(modelProperty.GetValue(this))) 
           select attribute.ErrorMessage; 
       return enumerable.FirstOrDefault(); 
      } 
      private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html 
     } 

     public string Error 
     { 
      get { return null; } 
      private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html 
     } 


     public virtual bool IsValid 
     { 
      get 
      { 
       var validationContext = new ValidationContext(this, null, null); 
       var valid = Validator.TryValidateObject(this, validationContext, null, validateAllProperties: true); 
       return valid; 
      } 
      private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html 
     } 
    } 
} 

以及物品是否完整,這裏是模型庫:

using System; 
using System.ComponentModel; 
using System.Linq.Expressions; 

namespace Sample.Data.Models.Infrastructure 
{ 
    public abstract class ModelBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(Expression<Func<object>> property) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(BindingHelper.Name(property))); 
      } 
     } 
    } 
} 

而且的WebAPI控制器(這是超級簡單的了):

using System.Web.Http; 
using Sample.Data.Models; 

namespace Sample.Services.Api.Controllers 
{ 
    public class CourtsController : ApiController 
    { 
     // GET api/values 
     public Court Get() 
     { 
      return new Court {Abbreviation = "TEST", FullName = "Test Court", Active = true}; 
     } 

    } 
} 

我怎樣才能得到的是我想匿名委託通過序列化...忽視或以其他方式?

回答

4

你使用的是什麼版本的Json.NET?如果你沒有使用最新版本(5.0.8),那麼升級它並再次運行你的應用程序。

+1

4.5.11與WebApi一起安裝,我沒想過通過NuGet檢查更新。現在它在5.0.8上工作,所以這是絕對的問題。謝謝,詹姆斯......的答案和Json.NET。 :) –