无法使用带有websharper的联合类型转换为json记录

时间:2015-06-11 15:21:09

标签: json f# discriminated-union websharper

我正在使用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()。但是,如果我将工会转为枚举或删除它们就可以了。缺什么?

1 个答案:

答案 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