You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ReasonML中解码给定的JSON对象数组?

嘿,这个问题我熟!在ReasonML里解码JSON,我们最常用的就是bs-json库(它在ReScript生态里也是主流选择),下面一步步带你搞定这个需求:

步骤1:添加依赖

首先得把bs-json装到项目里,用npm或者yarn都行:

npm install bs-json --save
# 或者用yarn
yarn add bs-json

然后记得在你的bsconfig.json里把它加入依赖列表:

{
  "bs-dependencies": ["bs-json"]
}
步骤2:定义对应的数据类型

ReasonML是静态类型语言,我们得先把JSON的结构映射成Reason的类型,这样解码后才能得到类型安全的数据:

type animal = {
  name: string,
  tags: list(string), // 如果想转成数组就用array(string)
  age: int,
};
步骤3:编写解码器

接下来要写一个解码器,把JSON对象转换成我们定义的animal类型。bs-json提供了很多便捷的解码函数,比如field用来取JSON字段,string/int用来解码基本类型,list用来解码数组:

单个动物对象的解码器

我们可以用map3来同时处理三个字段,写法很简洁:

open Json.Decode;

let decodeAnimal =
  map3(
    field("name", string),    // 解码name字段为string
    field("tags", list(string)), // 解码tags数组为string列表
    field("age", int),        // 解码age字段为int
    (name, tags, age) => {name, tags, age} // 组装成animal类型
  );

动物数组的解码器

有了单个对象的解码器,数组的解码器就简单了,直接用list包裹它就行(如果要转成数组就用array):

let decodeAnimalList = list(decodeAnimal);
步骤4:实际解码示例

现在把你提供的JSON字符串传进去解码,别忘了处理可能的错误(比如JSON格式不对、字段缺失之类的情况):

let rawJson = "[ {\"name\": \"foo\", \"tags\": [\"bird\", \"animal\"], \"age\": 10}, {\"name\": \"bar\", \"tags\": [\"dog\", \"animal\"], \"age\": 5}, {\"name\": \"baz\", \"tags\": [\"cat\", \"animal\"], \"age\": 3} ]";

switch (Json.parse(rawJson) |> result(decodeAnimalList)) {
| Ok(animals) => Js.log("解码成功!动物列表:", animals)
| Error(error) => Js.log2("解码出错啦:", error)
};

这样就能得到类型安全的animal list啦,后续操作这些数据的时候,编辑器会给你类型提示,还能避免很多类型错误~

内容的提问来源于stack exchange,提问作者Rotareti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:02:41