Wie kann ich benutzerdefinierte JsonSerializerSettings für Json.NET in der MVC 4-Web-API festlegen?

74

Ich verstehe, dass die ASP.NET-Web-API Json.NET nativ zum (De-) Serialisieren von Objekten verwendet. Gibt es jedoch eine Möglichkeit, ein JsonSerializerSettingsObjekt anzugeben , das verwendet werden soll?

Was wäre zum Beispiel, wenn ich typeInformationen in die serialisierte JSON-Zeichenfolge aufnehmen möchte ? Normalerweise würde ich Einstellungen in den .Serialize()Aufruf einfügen, aber die Web-API erledigt dies im Hintergrund. Ich kann keine Möglichkeit finden, Einstellungen manuell einzufügen.

Richard Neil Ilagan
quelle

Antworten:

112

Sie können das anpassen, JsonSerializerSettingsindem Sie die Formatters.JsonFormatter.SerializerSettingsEigenschaft im HttpConfigurationObjekt verwenden.

Sie können dies beispielsweise in der Application_Start () -Methode tun:

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.Formatting =
        Newtonsoft.Json.Formatting.Indented;
}
carlosfigueira
quelle
38
Können Sie dies pro Controller oder Aktion tun?
Chazt3n
1
Ich kann dies nicht in der ASP.NET-App mit installiertem HangFire zum Laufen bringen. Es bezieht sich auf die falsche Bibliothek oder so. musste die andere Antwort mit Standardeinstellungen verwenden ..
Piotr Kula
Sie können dies pro Controller oder Aktion tun: stackoverflow.com/questions/44499041/…
Alx
41

Sie können JsonSerializerSettingsfür jedes angeben JsonConvertund einen globalen Standard festlegen .

SingleJsonConvert mit Überlastung:

// 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
    }
);

Globale Einstellung mit Code Application_Start()in Global.asax.cs:

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

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

Smockle
quelle
3
FWIW, die zweite Methode war die, die ich ursprünglich ausprobiert habe und die nicht funktioniert hat. Ich musste HttpConfigurationstattdessen wie in der Antwort von carlosfigueira verwenden, da die in konfigurierten Einstellungen JsonConvert.DefaultSettingsnicht beachtet wurden.
lc.
2
In meinem Fall hat die globale Einstellung JsonSerializerSettings für mich funktioniert. Ich konnte die HttpCOnfiguration nicht zum Laufen bringen, sie kam mit anderen Assembly-Methoden (Hangifre) zurück und wusste nicht warum.
Piotr Kula
Kann ich ein verstecktes Feld verwenden formHiddenField.Value = JsonConvert.SerializeObject(listaCursos, Formatting.Indented, jsonSerializerSettings);und JQuery verwenden, um den Wert abzurufen var data = $('#formHiddenField').val();?
Kiquenet
2

Antwort ist das Hinzufügen dieser 2 Codezeilen zur Global.asax.cs Application_Start-Methode

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

Referenz: Umgang mit kreisförmigen Objektreferenzen

AEMLoviji
quelle