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

Car*_*uez 6 serialization f# json

是否可以使用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)
Run Code Online (Sandbox Code Playgroud)

output.json文件包含以下JSON:

[
  {
    "name": "Helena",
    "age": {
      "Some": 24
    }
  },
  {
    "name": "Peter",
    "age": null
  }
]
Run Code Online (Sandbox Code Playgroud)

但我希望JSON文件的内容看起来像这样:

[
  {
    "name": "Helena",
    "age": 24
  },
  {
    "name": "Peter"
  }
]
Run Code Online (Sandbox Code Playgroud)

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

Stu*_*art 3

使用 Newtonsoft.Json,您可以使用此处的要点(来源:Isaac Abraham)来为您提供所需的行为。

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