第 12 章:JSON 解析与生成
HTTP body 是原始字节,JsonCpp 负责解析,JsonHelper 只提供若干便利封装。
1. HTTP 请求体与 JSON 解析
request.bodyView() 返回原始请求体视图,不会自动确认内容为 JSON。业务处理需要结合 Content-Type、请求体大小、解析结果和字段类型进行校验。
2. 服务端显式解析
Json::CharReaderBuilder builder;
Json::Value input;
std::string errors;
// bodyView() 是非拥有视图;本例在当前回调中立即解析。
const std::string_view body = request.bodyView();
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
if(!reader->parse(body.data(), body.data() + body.size(), &input, &errors))
return client.sendText("invalid json", "400 Bad Request") ? -1 : -2;
if(!input.isMember("name") || !input["name"].isString())
return client.sendText("name is required", "422 Unprocessable Entity") ? -1 : -2;3. JsonHelper 的真实契约
| API | 行为 | 失败/边界 |
|---|---|---|
toString(Value) | 序列化为紧凑 JSON 文本 | 字符串值会带 JSON 引号 |
toJsonArray(text) | 解析为 Json::Value | 失败时输出错误并返回空 Value;服务端通常应自己解析以控制响应 |
createJson(...) | 按 key/value 对创建扁平对象 | 参数按 key/value 成对传入;布尔值保持 JSON bool,不转成整数 |
createArray(...) | 创建数组 | 复杂嵌套结构适合直接操作 Json::Value |
jsonAdd(a,b) | 对象合并成员;数组追加元素 | 解析失败或对象/数组类型混用时返回空字符串 |
getValue() | 提取字段或数组元素 | -1 失败,0 标量,1 对象/数组 |
4. 字段类型与校验
const std::string text = stt::data::JsonHelper::createJson(
"ok", true,
"count", 3,
"message", "ready");
Json::Value value = stt::data::JsonHelper::toJsonArray(text);
if(value.isObject() && value["ok"].isBool())
std::cout << value["ok"].asBool() << '
';手工拼接 JSON 容易产生转义、类型和结构错误。字符串转义、Unicode、数字和布尔类型都容易写错。请求体上限、对象结构和字段类型共同构成字段读取前的校验条件。