2012-08-01 19 views
6

Varolan bir JSON API'sını hacky MVC3 uygulamasından en son MVC4 Web Api'ye dönüştürmeyi arıyorum. MVC3 uygulaması, yükseltmeyi güzel ve pürüzsüz hale getirecek tüm serileştirmeyi yapmak için JSON.NET kullanıyor.Eylem başlatılan ASP Web API'sı Json serileştirme özelleştirme

Bazı eylem sonuçları tefrika olsun nasıl özelleştirme takılıp duyuyorum. Örneğin, bazı eylemlerin çıkışlı nesnelerin yalnızca birkaç özelliğini geri döndürmesini istiyorum, diğerleri ise daha derin serileştirme yapabilir. Geçerli benim uygulamasında, bir eylem HttpContext uygun ayarları ayarlayarak seri geçersiz kılma bir demet ekleyebilir. Bunlar daha sonra JsonResult'dan türetilmiş bir sınıf aracılığıyla özel serileştirme için alınır. Özel JsonConverters eklemenin ana kullanımı, serileştirilen anahtar/değerlerin sayısını denetlemek ve azaltmaktır ve eylemlere bağlı olarak parametreleri serileştirmek için parametreleri değiştirir (bazı eylemler diğerlerinden daha fazla nesne parametresi döndürmelidir).

bir denetleyici ve benim şimdiki MVC3 uygulamasında sınıf kontrol json serileştirme Yoğunlaştırılmış örnek: Ben yapılandırmasından Json formatlayıcıyı almak ve küresel serializations değiştirebilir görüyoruz Web Api olarak

public class TestController : JsonController { 
    public JsonResult Persons() { 
     ControllerContext.HttpContext.Items[typeof(IEnumerable<JsonConverter>)] = new JsonConverter[] { 
      new InterfaceExtractorJsonConverter<IPersonForList>(), 
      new StringEnumConverter() 
     }; 

     ControllerContext.HttpContext.Items[typeof(IContractResolver)] = new SpecialCamelCasePropertyNamesContractResolver(); 
    } 
} 

public class JsonNetResult : JsonResult { 
    public override void ExecuteResult(ControllerContext context) { 
     var response = context.HttpContext.Response; 

     var additionalConverters = context.HttpContext.Items[typeof(IEnumerable<JsonConverter>)] as IEnumerable<JsonConverter> ?? Enumerable.Empty<JsonConverter>(); 

     var contractResolver = context.HttpContext.Items[typeof(IContractResolver)] as IContractResolver ?? new JsonContractResolver(); 

     var typeNameHandling = TypeNameHandling.None; 
     if (context.HttpContext.Items.Contains(typeof(TypeNameHandling))) 
      typeNameHandling = (TypeNameHandling)context.HttpContext.Items[typeof(TypeNameHandling)]; 

     response.Write(JsonConvert.SerializeObject(Data, Formatting.Indented, new JsonSerializerSettings { 
      ContractResolver = contractResolver, 
      ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
      Converters = additionalConverters, 
      TypeNameHandling = typeNameHandling 
     })); 
    } 
} 

.

var config = new HttpSelfHostConfiguration("http://localhost:8080"); 

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().Single(); 

jsonFormatter.SerializerSettings.ContractResolver = new SpecialCamelCasePropertyNamesContractResolver(); 
jsonFormatter.SerializerSettings.Converters = new[] { new InterfaceExtractorJsonConverter<ITesting>() }; 

Ancak, kullanılacak JsonConverter's belirtmek için bazı özelliklerini ekleyerek bireysel olarak (veya denetleyici başına) üzerinde gerçekleştirilen işlem seri kontrol planlıyordu. Bu nedenle, Json serializer'ın, çağrılan aksiyon/kontrol ünitesine verilen ilgili nitelikleri bulmasını ve buna göre serileştirmeyi değiştirmesini istiyorum. Bunu nerede ve nasıl yapacağından emin değilim. JsonMediaTypeFormatter'dan miras almalı ve işimi bir şekilde yapmalı mıyım? Başka hangi seçeneklerim var?

cevap

2

Hiçbir zaman serileşmeyi bu şekilde denetlemek isteyen birini görmedim.

class JsonNetFormatter : MediaTypeFormatter { 
    public override bool CanWriteType(Type t) { 
     return typeof(JsonNetResponse).IsAssignableFrom(t); 
    } 
    // TODO WriteToStreamAsync which is basically a copy of your original JsonNetResult 
} 
: bu nesneleri işleyebilir daha

class JsonNetResponse { 
    public IContractResolver ContractResolver { get;set; } 
    // Other Json.Net bits 
    public object Value { get; set; } 
} 

Sonra özel Formatter yaratacak: Ama yeniden işleme asgari miktarda hedefe ulaşmak için, ben doğrudan yönteminden bu bilgilerin hepsi dönecekti

İlgili konular