1

我正在使用 websharper 将记录/联合转换为以 json 格式发布到 API。这是声明:

[<NamedUnionCases "Icon">]
type IconName =
    | Aaabattery
    | Abacus

[<NamedUnionCases>]
type Size =
    | H1
    | H2
    | H3
    | H4
    | H5


type Icon = {title:string; name:IconName; size:Size; updated:DateTime; }


Icon {title = "hello";
  name = Aaabattery;
  size = H1;
  updated = 11/06/2015 3:18:29 p. m.;}

这就是我编码的方式:

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。但是,如果我将工会转为枚举或删除它,它们就起作用了。什么不见​​了?

4

1 回答 1

2

[<NamedUnionCases>]没有参数依赖于参数的名称来消除案例之间的歧义。例如,使用以下类型:

[<NamedUnionCases>]
type Foo =
    | Case1 of x: int
    | Case2 of y: int

值被序列化为{"x":123}or {"y":123},因此可以通过检查存在哪些字段来进行反序列化。但是在您的 typeSize中,所有情况的参数都为零,因此它们基本上都将被序列化为{},因此反序列化器不知道要选择哪种情况。

有几种解决方案:

  • 如果您想将这些值序列化为带有字段的对象,告诉它是哪种情况,请使用[<NamedUnionCases "fieldName">]获取例如。{"fieldName":"H1"}.
  • 如果要将它们序列化为常量或字符串,请使用如下Constant属性:

    type Size =
        | [<Constant 1>] H1
        | [<Constant 2>] H2
        | [<Constant 3>] H3
        | [<Constant 4>] H4
        | [<Constant 5>] H5
    

    例如,这种方式H1将被简单地序列化为1.

于 2015-09-29T13:07:02.527 回答