将JSON字段转换为ReasonML变体

Ber*_*and 2 json reason bucklescript bs-json

我有一个JSON结构,其中包含period可以是对象或字符串的字段。我已经在代码中准备好了变体,并且可以正常工作:

type period = {
  start: string,
  end_: string,
};

type periodVariant =
  | String(string)
  | Period(period);
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试将输入JSON转换为变量类型时:我只是不知道该怎么做。这是我的尝试:

let periodVariantDecode = (json: Js.Json.t): periodVariant => {
  switch(json) {
  | String(string) => String(Json.Decode.string(string))
  | period => Period(Json.Decode.{
      start: period |> field("start", string),
      end_: period |> field("end", string),
    })
  };
};
Run Code Online (Sandbox Code Playgroud)

现在,当然是因为我想匹配的东西,是类型还是不行的Js.Json.t对抗String这是我的一部分periodVariant,但我不知道该如何实现我想要的。

gle*_*nsl 6

either是为了什么。以及map方便地将现有解码器“提升”到您的变量类型。

type period = {
  start: string,
  end_:  string,
};

type periodVariant =
  | String(string)
  | Period(period);

let period = json =>
  Json.Decode.{
    start: json |> field("start", string),
    end_:  json |> field("end", string),
  };

let periodVariantDecode =
  Json.Decode.(either(
    period |> map(p => Period(p)),
    string |> map(s => String(s))
  ));
Run Code Online (Sandbox Code Playgroud)