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?