我正在使用websharper将记录/联合转换为json中的API。这是声明:
let ToJString (jP:Core.Json.Provider, msg:Widget) =
let enc = jP.GetEncoder<Widget>()
enc.Encode msg
|> jP.Pack
|> Core.Json.Stringify
printfn "D:"
let j = Core.Json.Provider.Create()
let data = ToJString(j, widget)
printfn "D: %A" data
这是我编码的方式:
printfn "D: %A" data
该程序永远不会到达最后.then()
。但是,如果我将工会转为枚举或删除它们就可以了。缺什么?
答案 0 :(得分:2)
[<NamedUnionCases>]
依赖于用于消除案例之间歧义的参数的名称。例如,使用以下类型:
[<NamedUnionCases>]
type Foo =
| Case1 of x: int
| Case2 of y: int
值序列化为{"x":123}
或{"y":123}
,因此可以通过检查哪些字段存在来进行反序列化。但是在你的类型Size
中,所有情况都没有参数,所以它们基本上都被序列化为{}
,所以反序列化器不会知道选择哪种情况。
有几种解决方案:
[<NamedUnionCases "fieldName">]
来获取例如。 {"fieldName":"H1"}
。如果要将它们序列化为常数或字符串,请使用Constant
属性,如下所示:
type Size =
| [<Constant 1>] H1
| [<Constant 2>] H2
| [<Constant 3>] H3
| [<Constant 4>] H4
| [<Constant 5>] H5
这种方式,例如H1
将被简单地序列化为1
。