jsonc的基本使用

官方中文主页:http://www.json.org/json-zh.html

项目地址:https://github.com/jehiah/json-c

示例:

json_object * cmd = json_object_new_object();
json_object_object_add(cmd, "cmd", json_object_new_int(1));

json_object * parm = json_object_new_object();
json_object_object_add(parm, "id", json_object_new_int(35));
json_object_object_add(parm, "ip", json_object_new_string("192.168.1.24"));
json_object_object_add(parm, "port", json_object_new_int(8899));
json_object_object_add(parm, "user", json_object_new_string("admin"));
json_object_object_add(parm, "pass", json_object_new_string("12345"));
json_object_object_add(parm, "other", NULL);

json_object_object_add(cmd, "parm", parm);

std::string strJson = json_object_to_json_string(cmd);

// json_object_put(parm);
json_object_put(cmd);

return strJson;
{ "cmd": 1, "parm": { "id": 35, "ip": "192.168.1.24", "port": 8899, "user": "admin", "pass": "12345", "other": NULL } }


注意
        使用C库最关心的是内存的分配和释放了。jsonc的内存管理是基于引用计数的内存树(链),如果把一个struct json_object 对象a,add到另一个对象b上,就不用显式的释放(json_object_put)a了,相当于把a挂到了b的对象树上,释放b的时候,就会释放a。当a即add到b上,又add到对象c上时会导致a被释放两次(double free),这时可以增加a的引用计数(调用函数json_object_get(a)),这时如果先释放b,后释放c,当释放b时,并不会真正的释放a,而是减少a的引用计数为1,然后释放c时,才真正释放a。
        比如说上面代码中如果去掉注释,代码运行到json_object_put(cmd)时就会崩溃(但观察cmd还有资源未被释放),因为parm已经被释放了。


——2014-7-9 14:18:08 补充解析多级object的例子:

/*{
	"cmd": 10,
		"param": {
			"name": "lala",
			"age": 25
	}
}*/

int _tmain(int argc, _TCHAR* argv[])
{
	std::string strJson = "{\"cmd\": 10,\"param\": {\"name\": \"lala\",\"age\": 25}}";
	char szJson[1024] = {0};
	strcpy(szJson, strJson.c_str());
	json_object * cmd = json_tokener_parse(szJson);
	int nCmd = json_object_get_int(json_object_object_get(cmd, "cmd"));
	json_object * param = json_object_object_get(cmd, "param");
	std::string strName = json_object_get_string(json_object_object_get(param, "name"));
	int strAge = json_object_get_int(json_object_object_get(param, "age"));
	json_object_put(cmd);
	return 0;
}


参考资料:
1、jsonc 使用笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值