STTNet 0.7.0

第 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、数字和布尔类型都容易写错。请求体上限、对象结构和字段类型共同构成字段读取前的校验条件。

完整 JSON 工具 Demo →