2013-12-11 3 views
4

У меня есть класс POCO, который наследуется от нескольких классов, чтобы дать поддержку INotifyPropertyChanged и DataAnnotations. Когда WebAPI возвращает экземпляр суда, сериализатор JSON.NET дроссели на анонимном метода делегат в ModelPropertyAnnotationsValidation с исключением (показывая RAW ответ от Скрипача):Ошибка сериализации JSON.NET в WebApi

{ «Message»: "Произошла ошибка. ""ExceptionMessage": "введите '' ObjectContent`1 не удалось сериализовать тело ответа для контента типа 'приложения/JSON; кодировка = UTF-8'", "ExceptionType.":" System.InvalidOperationException "," StackTrace ": null," InnerException ": {" Сообщение ":" произошла ошибка . ", " ExceptionMessage ":" Ошибка получения значения от "CS $ <> 9_ CachedAnonymousMethodDelegate5' на 'Sample.Data.Models.Court' "" ExceptionType. ":" Newtonsoft.Json.JsonSerializationException " "StackTrace":" в Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (Объект мишени) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues ​​(JsonWriter писателя, значение объекта, контракт JsonContainerContract, JsonProperty членов, JsonProperty недвижимость, JsonContract & memberContract, объект & memberValue) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject (JsonWriter writer, Object va LUE, контракт JsonObjectContract, JsonProperty член, JsonContainerContract collectionContract, JsonProperty containerProperty) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (JsonWriter автор, значение объекта, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty) \ г \ п на Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize (jsonWriter jsonWriter, значение объекта) \ г \ п на Newtonsoft.Json.JsonSerializer.SerializeInternal (jsonWriter jsonWriter, значение объекта) \ г \ n в System.Net.Http.Formatting.JsonMediaTypeFormatter. <> гр _DisplayClassd.b_ с() \ г \ п в System.Threading.Tasks.TaskHelpers.RunSynchronously (бродилки, CancellationToken лексем) " "InnerException": { "Сообщение":" ошибка имеет произошло ""ExceptionMessage.":". Common Language Runtime обнаружен недопустимый программу ", "ExceptionType": "System.InvalidProgramException", "StackTrace":" в GetCS $ <> 9 _CachedAnonymousMethodDelegate5 (Object) \ r \ n в Newtonsoft.Json.Serialization.DynamicValueProvider.ПолучитьЗначение (Объект мишени) "}}}

класса Суда (отредактированная для краткости):

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

И для полноты картины, вот ModelBase:

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. :) –

Смежные вопросы