2016-03-23 3 views
2

NewtonsoftのJsonライブラリには、カスタムコンバータやその他の設定を適用するためのグローバル設定を行う機能があります。私はシリアル化する各オブジェクトに対して明示的に呼び出す限り動作するカスタムコンバータを持っていますが、それをグローバルに設定したいので、それを行う必要はありません。Newtonsoft.Json DefaultSettings F#

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

そしてDefaultSettingsプロパティの正式署名は次のとおりです:

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

私はそうのようなF#1にこれを翻訳しようとしたC#でここに示すように、これは行うことができます。

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

これはエラーなしでコンパイルして実行しますが、カスタムコンバータはseriali zing。また、何らかの理由でプロパティを設定するとブール値が返され(したがって|> ignore)、このブール値がfalseであることに気付きました。

F#への翻訳で何か問題がありますか?または、組み込みコンバータに優先順位が適用されているため、おそらくNewtonsoftがカスタムコンバータを無視していますか?

+3

あなたは '='を使用しています(そしてあなたは結果を '無視する ')。代わりに '< - 'を使ってプロパティを設定したいとします。 – kvb

+0

@kvb多分私はこれを別の質問にするべきです。なぜF#は '== 'ではなく' = 'と比較するのですか? –

+3

'ignore'を使って自分自身を見つけたら、間違いなく何かを間違いなく実行しています。 –

答えて

3

コメントで述べたように、等価演算子(=)ではなく代入演算子(<-)を使用します。これを実行するとコンパイラはデリゲート変換を自動的に適用します(無視する結果はありません)ので、コードは次のようになります:

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