mcorest_api_json_read_next_token
此函数用于获取 JSON 流中下一个标记的类型。
MCO_RET mcorest_api_json_read_next_token(
/*IN*/ mcorest_api_json_read_ctx_t *ctx,
/*IN*/ MCOREST_API_JSON_TKN_TYPE expected_type,
/*OUT*/ MCOREST_API_JSON_TKN_TYPE *type
);如果 expected_type 不为 MCOREST_API_JSON_TKN_UNKNOWN,且与流中的下一个标记不匹配,则返回错误代码 MCO_E_REST_JSON,并通过 typepointer 返回实际的标记类型。根据返回的标记类型,应调用以下读取函数之一来读取数据:
- MCOREST_API_JSON_TKN_OBJECT_BGN:
mcorest_api_json_read_object_begin() - MCOREST_API_JSON_TKN_OBJECT_END:
mcorest_api_json_read_object_end() - MCOREST_API_JSON_TKN_ARRAY_BGN:
mcorest_api_json_read_array_begin() - MCOREST_API_JSON_TKN_ARRAY_END:
mcorest_api_json_read_array_end() - MCOREST_API_JSON_TKN_STRING:
mcorest_api_json_read_string() - MCOREST_API_JSON_TKN_NUMBER:
mcorest_api_json_read_\[numeric/long/i64/double\]()
如果返回的类型表示其中一个值,则无需再调用 mcorest_api_json_read_*() 函数。应继续读取下一个标记:
- MCOREST_API_JSON_TKN_TRUE
- MCOREST_API_JSON_TKN_FALSE
- MCOREST_API_JSON_TKN_NULL
参数
ctx
mcorest_api_json_read_ctx_t
指向 JSON 读取上下文结构的指针。
expected_type
MCOREST_API_JSON_TKN_TYPE
预期的MCOREST_API_JSON_TKN_TYPE下一个令牌的值。
type
MCOREST_API_JSON_TKN_TYPE
实际的MCOREST_API_JSON_TKN_TYPE下一个令牌的值。
返回
MCO_S_OK
成功。
MCO_E_REST_ *
任何一种网络服务错误码。
示例
static void read_object(void *ctx, mcohs_request_h req);
{
MCOREST_API_JSON_TKN_TYPE tkn = MCOREST_API_JSON_TKN_UNKNOWN;
mcorest_api_json_read_ctx_t jctx;
mcorest_api_stream_t jstream;
char key[32];
int len = sizeof(key);
long l;
mcorest_api_stream_with_request(req, &jstream);
mcorest_api_json_read_start(&jstream, &jctx);
// Start reading the top-level JSON object
mcorest_api_json_next_token(&jctx, MCOREST_API_JSON_TKN_OBJECT_BGN, NULL);
mcorest_api_json_read_object_begin(&jctx);
// Read first key in the top-level object
mcorest_api_json_next_token(&jctx, MCOREST_API_JSON_TKN_UNKNOWN, &tkn);
while (tkn == MCOREST_API_JSON_TKN_STRING)
{
// As long as we're getting strings from the object, we interpret them as keys,
// and then read the values
mcorest_api_json_read_string(&jctx, 1, 0, key, &len);
// Read the value type
mcorest_api_json_next_token(&jctx, MCOREST_API_JSON_TKN_UNKNOWN, &tkn);
if ((0 == strcmp(key, "max_records") && (tkn == MCOREST_API_JSON_TKN_NUMBER))
{
mcorest_api_json_read_long(&jctx, &l);
}
...
mcorest_api_json_next_token(&jctx, MCOREST_API_JSON_TKN_UNKNOWN, &tkn);
}
mcorest_api_json_read_object_end(jctx);
...
}