使用 FsPickler 对可选值进行 JSON 序列化

标签 json serialization f#

是否可以使用 FsPickler 在 F# 中序列化可选值,以便:

  • 当值为Some()时,包含的值被序列化
  • 当它为 None 时,它​​根本不会被序列化?

  • 使用以下示例代码:
    type Person = { name: string; age: int option }
    
    let data = [
      { name = "Helena"; age = Some(24) };
      { name = "Peter"; age = None }
    ] 
    
    let jsonSerializer = FsPickler.CreateJsonSerializer(true, true)
    let streamWriter = new StreamWriter(@"C:\output.json")
    let out = jsonSerializer.SerializeSequence(streamWriter, data)
    
    output.json文件包含以下 JSON:
    [
      {
        "name": "Helena",
        "age": {
          "Some": 24
        }
      },
      {
        "name": "Peter",
        "age": null
      }
    ]
    

    但我希望 JSON 文件的内容看起来像这样:
    [
      {
        "name": "Helena",
        "age": 24
      },
      {
        "name": "Peter"
      }
    ]
    

    我正在使用 FsPickler.Json v3.2.0 和 Newtonsoft.Json v9.0.1。

    更新(2017 年 1 月 11 日) :在下面的答案中使用 Stuart 链接的要点中的脚本,我得到了它的工作方式:
    let obj = { name = "Peter"; age = None }
    let stringWriter = new StringWriter()
    let jsonSerializer = new JsonSerializer()
    jsonSerializer.Converters.Add(new IdiomaticDuConverter())
    jsonSerializer.NullValueHandling <- NullValueHandling.Ignore
    jsonSerializer.Serialize(stringWriter, obj)
    

    最佳答案

    使用 Newtonsoft.Json,您可以使用 gist here (信用:艾萨克亚伯拉罕)给你你所追求的行为。

    很有趣,就在您发布此内容之前的片刻,我正在查看 FsPickler.Json 中是否存在相同的内容,但没有得出任何结论。您可以使用 FsPickler 中使用的 TypeShape 使要点更清晰,但不确定 FsPickler.Json 是否可以立即为您执行此操作。

    关于使用 FsPickler 对可选值进行 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578734/

    相关文章:

    javascript - 按字母顺序对对象列表进行排序

    python - 如何在 Python 中获取 JSON 格式的持久规则?

    java - 如何使用 JSONObject 将长纪元日期格式序列化为日期

    f# - 如果在图表渲染完成之前调用 FSharpChart.SaveAs () 保存空白图像

    python - 将curl命令从google-colab转换为python脚本

    ruby-on-rails - to_json 在 Rails 中返回字符串而不是 json

    c++ - boost 序列化 : Does the default constructor have to be public?

    wcf - 我可以防止特定数据成员被反序列化吗?

    parsing - 如何捕获没有引号字符的字符串

    f# - 使用Nunit公开F#测试用例方法以进行单元测试