如何使用json_object_object_add向已填充的JSON-C对象头部添加键值对?
JSON-C:
json_object_object_add能否将键值对插入到JSON对象起始位置? 不行,json_object_object_add没办法直接把新键值对放到JSON对象的起始位置。
为什么?
JSON-C默认创建的JSON对象底层是哈希表结构,哈希表本身是无序的——json_object_object_add只是把键值对塞进哈希表,最终序列化输出的键顺序由哈希表的内部规则决定,完全不跟着插入顺序走。你贴的示例代码里,Key 1最终很大概率会排在Key 2后面,甚至顺序随机,全看哈希计算的结果。
要实现前置插入怎么办?
如果必须严格控制键值对的输出顺序,有两种可行办法:
调整插入顺序
最简单的方式就是先插要放在开头的键值对,再插后续内容。比如:json_object *jobj = json_object_new_object(); // 先加要放在起始位置的键值对 json_object_object_add(jobj, "Key 1", json_object_new_string("value 1")); // 再加其他键值对 json_object_object_add(jobj, "Key 2", json_object_new_string("value 2"));使用有序JSON对象(JSON-C 0.12及以上版本)
从JSON-C 0.12版本开始,支持创建保留插入顺序的有序对象。你需要用json_object_new_object_ext并指定JSON_C_OBJECT_PRESERVE_KEY_ORDER标志来初始化对象。如果已经存在内容要插开头,得先把现有键值对暂存,清空对象后先加新键,再把旧键加回去:// 创建有序JSON对象 json_object *jobj = json_object_new_object_ext(JSON_C_OBJECT_PRESERVE_KEY_ORDER); json_object_object_add(jobj, "Key 2", json_object_new_string("value 2")); // 暂存现有键值对 json_object *val2 = json_object_object_get(jobj, "Key 2"); json_object_object_del(jobj, "Key 2"); // 先加要放在开头的键值对 json_object_object_add(jobj, "Key 1", json_object_new_string("value 1")); // 再加回原来的键值对 json_object_object_add(jobj, "Key 2", val2);
内容的提问来源于stack exchange,提问作者spiderwebdev
相关产品推荐
相关产品推荐

