【问题标题】:Newtonsoft.Json DefaultSettings issue with F#F# 的 Newtonsoft.Json DefaultSettings 问题
【发布时间】:2016-03-23 15:04:26
【问题描述】:

Newtonsoft 的 Json 库能够设置全局设置以应用自定义转换器和其他设置。我有一个自定义转换器,只要我为我序列化的每个对象显式调用它,它就可以工作,但我想全局设置它,所以我不必这样做。这可以按照 C# 中所示的方式完成:

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

DefaultSettings 属性的官方签名是:

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

我试着把它翻译成 F#:

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

这编译并执行没有错误,但序列化时未应用自定义转换器。另外,由于某种原因,设置属性返回一个布尔值(因此是 |&gt; ignore ),我注意到这个布尔值是错误的。

那么,我对 F# 的翻译有问题吗?还是 Newtonsoft 可能会因为优先应用内置转换器而忽略我的自定义转换器?

【问题讨论】:

  • 您正在使用 =,它测试是否相等(然后您将 ignoreing 结果)。您想改用&lt;- 来设置属性。
  • @kvb 也许我应该把它作为一个单独的问题。为什么 F# 与 = 进行比较而不是 ==
  • 如果你发现自己在使用ignore,那么你几乎肯定做错了什么。
  • @GuyCoder - 如果有疑问,答案通常是 O'Caml 兼容性。从逻辑上讲,我认为这个特定的选择也更有意义——为什么 = 符号应该与突变相关联?但它确实使从 C 风格语言的过渡更加困难。
  • 哈!谢谢。多么愚蠢的错误。 @kvb 如果你想回答我会接受的。

标签: f# json.net


【解决方案1】:

正如我在 cmets 中所说,您希望使用赋值运算符 (&lt;-) 而不是相等运算符 (=)。请注意,一旦你这样做了,编译器也会自动为你应用委托转换(并且没有结果可以忽略),所以你的代码可以变成:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多