gpt4 book ai didi

json - 如何将 F# Union 类型与 Servicestack JSON 序列化结合使用?

转载 作者:行者123 更新时间:2023-12-02 05:32:11 24 4
gpt4 key购买 nike

我想我对框架的要求太多了。但只是想知道这是否可能。或者有什么办法可以解决这个问题。

新版本的 JSON.Net 开始支持 F# 联合类型。解决这个问题的方法是什么,意味着如果我使用 servicestack.text,那么如何展平联合类型以支持序列化。

这是两者的代码示例。

type Shape =
| Rectangle of width : float * length : float
| Circle of radius : float
| Empty


[<EntryPoint>]
let main argv =
// printfn "%A" argv
let shape1 = Rectangle(1.3, 10.0)

let json = JsonConvert.SerializeObject(shape1) //JSON.net
printfn "%A" json
// {
// "Case": "Rectangle",
// "Fields": [
// 1.3,
// 10.0
// ]
// }

let shape2 = JsonConvert.DeserializeObject<Shape>(json) //JSON.Net
printfn "%A" (shape2 = shape1) //true

let sJson = JsonSerializer.SerializeToString shape1 //SS.Text
printfn "%A" sJson

let sShape2 = JsonSerializer.DeserializeFromString sJson //SS.Text
printfn "%A" (sShape2 = shape1) //false

Console.Read() |> ignore
0 // return an integer exit code

使用 servicestack 的反序列化返回 false。与 JSON.net 相比,生成的 json 字符串相当复杂。

如何实现联合类型的正确序列化?

最佳答案

您必须为 ServiceStack 提供一个自定义序列化程序。为了简洁起见,它会像这样使用较小的 Shape 类型:

open ServiceStack.Text

type Shape =
| Circle of float
| Empty

JsConfig<Shape>.SerializeFn
<- Func<_,_> (function
| Circle r -> sprintf "C %f" r
| Empty -> sprintf "E")

JsConfig<Shape>.DeSerializeFn
<- Func<_,_> (fun s ->
match s.Split [| |] with
| [| "C"; r |] -> Circle (float r)
| [| "E" |] -> Empty)

let shapes = [| Circle 8.0 |]
let json = JsonSerializer.SerializeToString(shapes)
let shapes1 = JsonSerializer.DeserializeFromString<Shape[]>(json)
let is_ok = shapes = shapes1

此代码在反序列化器中没有正确的异常传播:您需要处理不匹配的 match ,并且 float 可能会引发 System .FormatException

关于json - 如何将 F# Union 类型与 Servicestack JSON 序列化结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22370264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com