2016-03-23 8 views
2

Die Json-Bibliothek von Newtonsoft bietet die Möglichkeit, globale Einstellungen zum Anwenden benutzerdefinierter Konverter und anderer Einstellungen festzulegen. Ich habe einen benutzerdefinierten Konverter, der so lange funktioniert, wie ich ihn für jedes Objekt, das ich serialisiere, explizit anrufe, aber ich möchte es global einstellen, also muss ich das nicht machen. Dies kann geschehen, wie hier in C# gezeigt:Newtonsoft.Json DefaultSettings-Problem mit F #

https://stackoverflow.com/a/19121653/2506634

Und die offizielle Unterzeichnung der Defaultsettings Eigenschaft ist:

public static Func<JsonSerializerSettings> DefaultSettings { get; set; }

Ich habe versucht, dies wie so zu F # übersetzen:

JsonConvert.DefaultSettings = 
    System.Func<JsonSerializerSettings> 
    (fun() ->   
    let settings = new JsonSerializerSettings() 
    settings.Formatting <- Formatting.Indented 
    settings.Converters.Add(new DuConverter()) 
    settings  
) 
    |> ignore 

Dies kompiliert und ausführt, ohne Fehler, aber der individuelle Wandler ist nicht, wenn seriali angewendet zing. Aus irgendeinem Grund gibt das Setzen der Eigenschaft auch einen booleschen Wert zurück (daher die |> ignore) und ich habe festgestellt, dass dieser Boolesche Wert falsch ist.

Also, ist etwas falsch mit meiner Übersetzung zu F #? Oder ignoriert Newtonsoft meinen benutzerdefinierten Konverter, weil der integrierte Konverter Vorrang hat?

+3

Sie verwenden '=', was testet für die Gleichheit (und dann ignorierst du das Ergebnis). Sie möchten stattdessen '<-' verwenden, um die Eigenschaft festzulegen. – kvb

+0

@ kvb vielleicht sollte ich dies eine separate Frage machen. Warum ging F # mit '=' zum Vergleich anstelle von '=='? –

+3

Wenn Sie sich mit 'ignore' beschäftigen, tun Sie fast sicher etwas falsch. –

Antwort

3

Wie ich in den Kommentaren sagte, möchten Sie den Zuweisungsoperator (<-) anstelle des Gleichheitsoperators (=) verwenden. Beachten Sie, dass der Compiler dann automatisch die Delegate-Konvertierung für Sie anwendet (und es gibt kein zu ignorierendes Ergebnis), so dass Ihr Code einfach werden kann:

JsonConvert.DefaultSettings <- 
    fun() -> 
     let settings = new JsonSerializerSettings() 
     settings.Formatting <- Formatting.Indented 
     settings.Converters.Add(new DuConverter()) 
     settings  
Verwandte Themen