2012-11-07 12 views
55

ASP.NET Web API'sinin doğal olarak nesneleri nesnelleştirmek için Json.NET kullandığını biliyorum, ancak kullanmak istediğiniz JsonSerializerSettings nesnesini belirtmenin bir yolu var mı? Örneğin, type bilgisini serileştirilmiş JSON dizesine eklemek istediğimde ne yapmalıyım? Normalde ayarları .Serialize() aramasına enjekte ediyorum, ancak Web API bunu sessizce yapıyor. Ayarları el ile enjekte etmenin bir yolunu bulamıyorum.MVC 4 Web API'sı için Json.NET için özel JsonSerializerSettings nasıl ayarlanır?

cevap

97

HttpConfiguration nesnesindeki Formatters.JsonFormatter.SerializerSettings özelliğini kullanarak JsonSerializerSettings özelleştirebilirsiniz. Her JsonConvert için JsonSerializerSettings belirtebilirsiniz

protected void Application_Start() 
{ 
    HttpConfiguration config = GlobalConfiguration.Configuration; 
    config.Formatters.JsonFormatter.SerializerSettings.Formatting = 
     Newtonsoft.Json.Formatting.Indented; 
} 
+30

Eğer denetleyici veya eylem başına bunu yapabilir mi? – Chazt3n

+1

HangFire yüklü olan ASP.NET uygulamasında çalışmasını bulamıyorum. Yanlış libarary veya bir şey atıfta bulunuyor. Varsayılan ayarlarla diğer cevabı kullanmak zorunda kaldı .. – ppumkin

31

ve global varsayılan ayarlayabilirsiniz:

Örneğin, Application_Start() yönteminde bunu yapabilir.

Tek bir aşırı ile JsonConvert:

// Option #1. 
JsonSerializerSettings config = new JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }; 
this.json = JsonConvert.SerializeObject(YourObject, Formatting.Indented, config); 

// Option #2 (inline). 
JsonConvert.SerializeObject(YourObject, Formatting.Indented, 
    new JsonSerializerSettings() { 
     ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
    } 
); 

Küresel Global.asax.cs içinde Application_Start() kod ile ayarlanması:

JsonConvert.DefaultSettings =() => new JsonSerializerSettings { 
    Formatting = Newtonsoft.Json.Formatting.Indented, 
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
}; 

Referans: https://github.com/JamesNK/Newtonsoft.Json/issues/78

+3

FWIW, başlangıçta denediğim ikinci yöntemdi. JsonConvert.DefaultSettings'de yapılandırılan ayarların gözlenmediğinden, [carlosfigueira'nın cevabı] 'nda (http://stackoverflow.com/a/13274791/44853)' HttpConfiguration 'kullanılmalıydı. –

+1

Benim durumumda, 'JsonSerializerSettings' Global ayar kullanımı benim için çalıştı. HttpCOnfiguration işe yaramadı, başka bir derleme yöntemleri (Hangifre) ile geri geliyordu emin değilim neden emin değilim. – ppumkin

+0

Gizli form kullanabilirim "formHiddenField.Value = JsonConvert.SerializeObject (listaCursos, Formatting.Indented, jsonSerializerSettings);" ve JQuery değerini "var data = $ ('# formHiddenField') değerini almak için kullanın. Val();'? – Kiquenet

2

Cevap olduğunu bu 2 satırın eklenmesi o Global.asax.cs Application_Start yöntemine f kodu

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.All; 

Referans: Handling Circular Object References

İlgili konular