【问题标题】:How to convert Js.Json.t to Js.t('a)?如何将 Js.Json.t 转换为 Js.t('a)?
【发布时间】:2020-02-09 23:45:05
【问题描述】:

我已经通过 bs-json 编码了一个对象,并希望使用 bs-axios 通过 post 将其作为数据发送。

  33 │ let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/
       test", p |> Data.encodeToBuyListItem);
...
  This has type:
    Js.Json.t (defined as Js.Json.t)
  But somewhere wanted:
    Js.t('a)

p |> Data.encodeToBuyListItem 是红色的。如何使用Js.Json.t 值作为发布请求的数据?

编辑:

好吧,这行得通:

let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/test", [%raw "p"]);

但我更喜欢非 hacky 的解决方案(最好使用 bs-json,因为我正在使用它来解码 JSON)...

【问题讨论】:

  • 如果这不是您真正需要的,为什么还要将其编码为Js.Json.t?你可以直接创建一个Js.t 对象。
  • @glennsl 好吧,我正在使用 bs-json 进行解码,所以我认为我也应该使用它进行编码(我只遵循了编码示例)。在 bucklescript 文档中也推荐它,我真的不知道如何使用Js.t

标签: reason bucklescript bs-json


【解决方案1】:

没有办法安全地将Js.Json.t 转换为Js.t,因为后者代表一个JavaScript 对象,而JSON 不仅仅代表对象。但是bs-axios 似乎无论如何都把安全扔到了窗外,所以你可以不安全地施放它:

external jsonToObjects : Js.Json.t => Js.t({..}) = "%identity";

%identity 是一种通用机制,可用于在任意两种类型之间进行强制转换,因此在键入时这是不安全的。你基本上是在说“当我交换这些东西的时候把目光移开,相信我,我知道我在做什么”。所以请务必这样做。

另一种选择是直接创建一个Js.t 对象。 Reason 有内置的语法,所以很简单:

let obj = {
  "data": someData
};

这里的someData 可以是任何值,甚至是Js.Json.t 值,但这也意味着您可以传入不可序列化的值,Js.Json.t 可以保护您免受此类攻击。

鉴于bs-axios API 本质上是不安全的,这里有一个小的安全折衷,但我认为无论哪个最简单都可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多