[英]Serializing F# Discriminated union as strings with 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
創建一個自定義的Json.NET JsonConverter並使用它來裝飾有區別的聯合(“enum style”)足以讓它以我想要的方式工作。 其中很大一部分是從@Brian Rogers在C# https: //stackoverflow.com/a/22355712/1924257的答案中音譯出來的。
open System
open Newtonsoft.Json // 10.0.3
open Newtonsoft.Json.Converters
type ToStringJsonConverter () =
inherit JsonConverter()
override this.CanConvert objectType = true;
override this.WriteJson (writer: JsonWriter, value: obj, serializer: JsonSerializer): unit =
writer.WriteValue(value.ToString())
override this.CanRead = false
override this.ReadJson (reader: JsonReader, objectType: Type, existingValue: obj, serializer: JsonSerializer) : obj =
raise (new NotImplementedException());
[<JsonConverter(typeof<ToStringJsonConverter>)>]
type HowLame =
| PrettyLame
| SuperLame
type Lame = {
howLame: HowLame
}
[<EntryPoint>]
let main argv =
let lame = { howLame = PrettyLame }
let ser = JsonConvert.SerializeObject(lame)
// {"howLame":"PrettyLame"}
printfn "%s" ser
0 // return an integer exit code
如果您願意將DU設為enum(通過指定顯式值,因為沒有'payload'可能沒有問題),您可以使用標准的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"}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.