json - 使用 Json.NET 将 F# 区分联合序列化为字符串

标签 json serialization f# json.net

我正在尝试在序列化时从 F# 的可区分联合转换为字符串,而不是默认的“Case”:[value]”。能够再次反序列化值不是问题。也许可以使用 Json.NET ?

// Fsharp 4.1.0
open Newtonsoft.Json // 10.0.3

type HowLame =
| PrettyLame
| SuperLame

type Lame = {
    howLame: HowLame;
}

[<EntryPoint>]
let main argv =
    let lame = { howLame = PrettyLame }
    let ser = JsonConvert.SerializeObject(lame)

    // {"soLame":{"Case":"PrettyLame"}} by default
    printfn "%s" ser

    // Desired
    assert (ser = """{"soLame":"PrettyLame"}""")
    0 // return an integer exit code

最佳答案

如果您愿意将 DU 设为枚举(通过指定显式值,这可能是可以的,因为没有“有效负载”),您可以使用标准 StringEnumConverter :

#r "../packages/Newtonsoft.Json/lib/net45/Newtonsoft.Json.dll"
open Newtonsoft.Json

type HowLame = PrettyLame=0 | SuperLame=1
type Lame = { howLame: HowLame; }

// in contrast to DUs, enums must be qualified, i.e. Enum.Value
let lame = { howLame = HowLame.PrettyLame }

let settings = JsonSerializerSettings()
settings.Converters.Add(Converters.StringEnumConverter())

let ser = JsonConvert.SerializeObject(lame, settings)
// val ser : string = "{"howLame":"PrettyLame"}"

关于json - 使用 Json.NET 将 F# 区分联合序列化为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47247269/

相关文章:

javascript - JSON 对象和 JSON 文档有什么区别?

java - JSON 文件在 JAVA 中被读取两次而不是一次

c++ - 如何使用 boost XML 存档序列化 OpenCV Mat

javascript - 如何附加图像序列化?

f# - 在 .NET Core 2.1 中使用 F# (FSharp.Core 4.3.4) 类型提供程序

javascript - 将正则表达式应用于 javascript 中的 uri 变量

android - 使用可选字段解析 JSON

javascript - 使用字符串数组键转换对象

types - 在 F# 中实现包含元素的队列类型

casting - 如何将一个类型转换回一个值之前的类型?