在 MoonBit 里,处理 JSON 最常用的是 moonbitlang/core/json。
它主要解决两件事:
- 把 MoonBit 数据变成 JSON
- 把 JSON 变回 MoonBit 数据
最核心的几个关键词只有这几个:
Jsonto_json()@json.from_json(...)derive(ToJson, FromJson)
先知道:JSON 在 MoonBit 里不是只能当字符串
很多初学者一想到 JSON,就会想到一大段字符串。
但在 MoonBit 里,更常见的做法是把它当成一个值类型:Json。
比如:
let j : Json = {
"name": "Alice",
"age": 18
}
这就是一个 JSON 值,不是手搓字符串。
所以你可以把 Json 理解成:
“MoonBit 里专门表示 JSON 数据的类型”
最常见操作 1:直接写 JSON
当你想构造 JSON 数据时,写法很自然:
let user : Json = {
"id": 1,
"name": "Alice",
"active": true
}
还可以嵌套:
let config : Json = {
"app": "demo",
"database": {
"host": "127.0.0.1",
"port": 5432
}
}
这非常适合写测试数据,构造请求体,做 demo。
最常见操作 2:结构体转 JSON
如果你有一个 MoonBit 结构体,想把它转成 JSON,最常见写法是:
- 给类型加
derive(ToJson, FromJson) - 调用
.to_json()
struct User {
name : String
age : Int
} derive(ToJson, FromJson, Eq)
let u = User::{ name: "Alice", age: 18 }
let j = u.to_json()
这时 j 就是一个 Json 值。
你可以把 to_json() 理解成:
“把 MoonBit 对象编码成 JSON”
最常见操作 3:JSON 转结构体
反过来,如果你有一段 JSON,想把它变成 MoonBit 类型,可以用:
@json.from_json(...)
例如:
struct User {
name : String
age : Int
} derive(ToJson, FromJson, Eq)
let j : Json = {
"name": "Alice",
"age": 18
}
let u : User = @json.from_json(j)
这时 u 就是强类型的 User。
你可以把它理解成:
“把 JSON 解析成 MoonBit 对象”
最推荐的使用方式
实际写项目时,推荐你这样理解:
输入 JSON
↓
转成 MoonBit 类型
↓
写业务逻辑
↓
再转回 JSON
也就是边界层用 JSON,业务层用强类型,这样代码会更清楚,也更不容易出错。
一个最小完整例子
import {
"moonbitlang/core/json" @json,
}
struct User {
user_id : Int
name : String
} derive(
FromJson(fields(user_id(rename="userId"))),
ToJson(fields(user_id(rename="userId"))),
Eq
)
fn main {
let input : Json = {
"userId": 1,
"name": "Alice"
}
let user : User = @json.from_json(input)
let output : Json = user.to_json()
ignore(output)
}
这个例子展示了 MoonBit JSON 最核心的 3 步:
- 写
Json from_jsonto_json
为什么有 rename?
因为代码里的字段名和 JSON 里的字段名可能不一样。
比如:
- MoonBit 里喜欢写:
user_id - JSON 里常见写法:
userId
所以可以这样写:
fields(user_id(rename="userId"))
这表示:
- MoonBit 字段叫
user_id - JSON 字段叫
userId
这样就能同时兼顾两边的命名风格。
你现在只需要记住这 4 件事
Json
表示 JSON 数据本身。
derive(ToJson, FromJson)
让类型自动支持 JSON 编解码。
value.to_json()
把对象转成 JSON。
@json.from_json(...)
把 JSON 转成对象。
先把 JSON 收进来,转成类型处理,最后再转回 JSON。
总结
MoonBit 的 JSON 处理思路其实很清晰:
Json:表示 JSON 数据to_json():对象转 JSON@json.from_json(...):JSON 转对象derive(ToJson, FromJson):自动生成编解码能力
如果你只学入门,先把这条主线掌握就够了。
