解码 ReasonML 中的 Json/Reading 个错误

Decoding Json/Reading Errors in ReasonML

我收到了一个从 aws 的 appsync 服务返回的 graphql 查询。 这是从查询返回的 json。

https://github.com/idkjs/reason-apollo-question/blob/600584c454ffb2efd08b8e42e3adca0eb151ba60/scratch/persons.json#L1-L27

    {
  "data": {
    "listPeople": {
      "items": [
        {
          "age": 23,
          "id": "123",
          "name": "BobTest",
          "__typename": "Person"
        },
        {
          "age": 24,
          "id": "124",
          "name": "JoeTest",
          "__typename": "Person"
        },
        {
          "age": 25,
          "id": "125",
          "name": "JimTest",
          "__typename": "Person"
        }
      ],
      "__typename": "PersonConnection"
    }
  }
}

这是登录到控制台的样子。

这是 apollo-dev-tools 中的查询响应:

访问 items 数组时出错。

正在尝试将 items 值记录到 运行 控制台 https://github.com/idkjs/reason-apollo-question/blob/d38e7fbc33f02ab718c7227958d88f02adba1696/src/Persons.re#L66-L70

| Data(response) =>
               Js.log(response##listPeople);
               let listPeople = response##listPeople;
               let items = response##listPeople##items;
Js.log(items);

产生此错误:

      We've found a bug for you!
  /Users/prisc_000/code/REASON/APOLLO/reason-apollo-question/src/Persons.re 69:32-51

  67 ┆ Js.log(response##listPeople);
  68 ┆ let listPeople = response##listPeople;
  69 ┆ let items = response##listPeople##items;
  70 ┆ Js.log(items);
  71 ┆

  This has type:
    option({. "items": option(Js.Array.t(option(
      {. "age": int, "id": string, "name":  string})))
      })

   But somewhere wanted:
    Js.t('a)

    ninja: build stopped: subcommand failed.
    >>>> Finish compiling(exit: 1)

如何解决此类型错误?

谢谢!

解决方案:

https://github.com/idkjs/reason-apollo-question/blob/2924b1eb928cf0e4de57d5659c5da1bed4dd981c/src/Persons.re#L31-L33

基本上,我还没有摸索到 Some/None 个变量。

当你看到编译器告诉你它正在寻找上面错误中指出的选项时,你已经通过将值包装在 Some.

中获得了值(如果存在)

所以这个:

let name = item##name;
let id = item##id;
let age = item##age;

必须更改为:

let name = Some(item##name);
let id = Some(item##id);
let age = Some(item##age);

就是这样。

您似乎将 response##listPeople 定义为一个选项,因此您不能直接对其调用 response##listPeople##items。在从中读取 items 之前,您应该对 response##listPeople 进行模式匹配。