Json---实践
2015-12-28 19:44
726 查看
假设有Json串如下:
读取操作:
写入操作:
{ "cmd" : "request1", "account" : "com", "rcode" : 0, "result" : 1, "list" : [ { "info" : { "timestamp" : 123123212, "serial_number" : "12132323", "model_name" : "aaaaaa", "adapter_name" : "ccccc" }, "list" : [ { "activate" : 0 } ] }, { "info" : { "timestamp" : 1231231221, "serial_number" : "12323212", "model_name" : "bbbbb", "adapter_name" : "ccccc" }, "list" : [ { "activate" : 0 } ] } ] }
读取操作:
_common_json_parse_response(const gchar *data, json_response *response) { JsonParser *parser = NULL; gssize length = -1; GError *error = NULL; parser = json_parser_new(); gboolean ret = json_parser_load_from_data(parser, data, length, &error); JsonNode *root = json_parser_get_root(parser); JsonObject *root_obj = json_node_get_object(root); __get_response_cmd(root_obj, response); __get_response_account(root_obj, response); __get_response_rcode(root_obj, response); __get_response_rresult(root_obj, response); __get_response_list(root_obj, &response->list); __get_response_info(root_obj, response); g_object_unref(parser); } static void __get_response_cmd(JsonObject *obj, json_response *response) { if (json_object_has_member(obj, JSON_STRING_CMD)) response->cmd = g_strdup(json_object_get_string_member(obj, JSON_STRING_CMD)); } static void __get_response_info(JsonObject *obj,json_response *response) { if (!json_object_has_member(obj, JSON_STRING_LIST)) { return; } JsonArray *array = json_object_get_array_member (obj, JSON_STRING_LIST); guint arr_len = json_array_get_length(array); int i = 0; for (i = 0; i < arr_len; i++) { JsonNode *node = json_array_get_element(array, i); JsonObject *node_obj = json_node_get_object(node); if (json_object_has_member(node_obj, JSON_STRING_INFO)) { JsonObject *temp_obj = json_object_get_object_member(node_obj, JSON_STRING_INFO); json_info *tinfo= g_malloc0( sizeof(json_info)); int flag = 0; if (json_object_has_member(temp_obj, JSON_STRING_MODEL)) { flag = 1; tinfo->model_name = g_strdup(json_object_get_string_member(temp_obj, JSON_STRING_MODEL)); } if (json_object_has_member(temp_obj, JSON_STRING_SERIAL)) { flag = 1; tinfo->serial_num = g_strdup(json_object_get_string_member(temp_obj, JSON_STRING_SERIAL)); } if (json_object_has_member(temp_obj, JSON_STRING_TIMESTAMP)) { flag = 1; tinfo->timestamp = json_object_get_int_member(temp_obj, JSON_STRING_TIMESTAMP); } if (json_object_has_member(temp_obj, JSON_STRING_TYPE)) { flag = 1; tinfo->adapter_name = g_strdup(json_object_get_string_member(temp_obj, JSON_STRING_TYPE)); } if (json_object_has_member(node_obj, JSON_STRING_LIST)) { flag = 1; _common_json_get_type_list(node_obj, &tinfo->list); } if (flag == 0) { g_free(tinfo); tinfo = NULL; continue; } response->info_list = g_list_append(response->info_list, tinfo); } } } static void __get_response_list(JsonObject *obj, GList **list) { if (!json_object_has_member(obj, JSON_STRING_LIST)) { return ; } JsonArray *array = json_object_get_array_member (obj, JSON_STRING_LIST); guint arr_len = json_array_get_length(array); int i = 0; for (i = 0; i < arr_len; i++) { JsonNode *node = json_array_get_element(array, i); JsonObject *node_obj = json_node_get_object(node); json_response_item *item = (json_response_item *)g_malloc0( sizeof(json_response_item)); int flag = 0; if (json_object_has_member(node_obj, JSON_STRING_DATA)) { flag = 1; item->data = g_strdup(json_object_get_string_member(node_obj, JSON_STRING_DATA)); } if (json_object_has_member(node_obj, JSON_STRING_TYPE)) { flag = 1; item->adapter_name = g_strdup(json_object_get_string_member(node_obj, JSON_STRING_TYPE)); } if (json_object_has_member(node_obj, JSON_STRING_PERCENT)) { flag = 1; item->progress_percent = json_object_get_int_member(node_obj, JSON_STRING_PERCENT); } if (json_object_has_member(node_obj, JSON_STRING_STATUS)) { flag = 1; item->status = g_strdup(json_object_get_string_member(node_obj, JSON_STRING_STATUS)); } if (json_object_has_member(node_obj, JSON_STRING_RESULT)) { flag = 1; item->result = g_strdup(json_object_get_string_member(node_obj, JSON_STRING_RESULT)); } if (json_object_has_member(node_obj, JSON_STRING_ERROR)) { flag = 1; item->error = json_object_get_int_member(node_obj, JSON_STRING_ERROR); } if (flag == 0) { g_free(item); item = NULL; continue; } *list = g_list_append(*list, item); } }
写入操作:
_common_json_make_response(char **data, json_response *response) { JsonGenerator *generator = NULL; JsonObject *object = NULL; JsonNode *root = NULL; gsize len = 0; generator = json_generator_new(); root = json_node_new(JSON_NODE_OBJECT); object = json_object_new(); json_object_set_string_member(object, JSON_STRING_CMD, response->cmd); if (response->server_time > 0) { char *time = g_strdup_printf("%llu", response->server_time); json_object_set_string_member(object, JSON_STRING_TIMESTAMP, time); g_free(time); } json_object_set_int_member(object, JSON_STRING_CODE, response->rcode); __set_storage_info(object, response->server_storage_info); if (response->result != -1) json_object_set_int_member(object, JSON_STRING_RESULT, response->result); __set_response_info(object, response); __set_response_list(object, &response->list); json_node_take_object(root, object); json_generator_set_root(generator, root); *data = json_generator_to_data(generator, &len); json_node_free(root); g_object_unref(generator); } static void __set_response_info(JsonObject *object, json_response *response) { int count = 0; JsonArray *array = NULL; if (response->info_list) { count = g_list_length(response->info_list); int i = 0; array = json_array_new(); if (array) { for (i = 0; i < count; i++) { json_backup_info *tinfo = (json_backup_info *)g_list_nth_data(response->info_list, i); JsonObject *temp_obj = json_object_new (); _common_json_set_int_member(temp_obj, JSON_STRING_TIMESTAMP, tinfo->timestamp); _common_json_set_string_member(temp_obj, JSON_STRING_SERIAL, tinfo->serial_num); _common_json_set_string_member(temp_obj, JSON_STRING_MODEL, tinfo->model_name); _common_json_set_string_member(temp_obj, JSON_STRING_TYPE, tinfo->adapter_name); JsonObject *main_obj = json_object_new (); json_object_set_object_member(main_obj, JSON_STRING_INFO, temp_obj); _common_json_set_type_list(main_obj, &tinfo->list); json_array_add_object_element(array, main_obj); } json_object_set_array_member(object, JSON_STRING_LIST, array); } } } static void __set_response_list(JsonObject *object, GList **list) { int count = 0; JsonArray *array = NULL; if (*list) { count = g_list_length(*list); int i = 0; array = json_array_new(); if (array) { for (i = 0; i < count; i++) { json_response_item *item = (json_response_item *)g_list_nth_data(*list, i); JsonObject *temp_obj = json_object_new (); if (item->progress_percent != -1) _common_json_set_int_member(temp_obj, JSON_STRING_PERCENT, item->progress_percent); _common_json_set_string_member(temp_obj, JSON_STRING_STATUS, item->status); if (item->error != -1) _common_json_set_int_member(temp_obj, JSON_STRING_ERROR, item->error); _common_json_set_string_member(temp_obj, JSON_STRING_ADAPTER_ID, item->adapter_id); _common_json_set_string_member(temp_obj, JSON_STRING_RESULT, item->result); _common_json_set_string_member(temp_obj, JSON_STRING_DATA, item->data); json_array_add_object_element(array, temp_obj); } json_object_set_array_member(object, JSON_STRING_LIST, array); } } }
相关文章推荐
- Json---基础概念
- Json---基础概念
- JavaScript如何处理解析JSON数据详解
- JS判断小数点后有几位
- jsp 用 EL 获取集合的长度
- js实现展示file表单的图片
- 【学习笔记javascript设计模式与开发实践(命令模式)----9】
- JS 字符串的 哈希值
- JS 获取随机数的几方法
- jboss 7.1.1 Final 的jsp热部署解决方案(转载)
- JavaScript 面向对象开发
- 自定义JS插件
- JavaScript中showModalDialog (模态窗口)详细使用
- 【JavaScript.6】阶段概念总结之HTML+CSS+JavaScript+xml+xpath+Json+Ajax
- JavaScript的运动框架学习总结
- JS截取URL后面的参数,并格式化HTML编码
- 原生js Ajax
- JavaScript 学习—— js获取行间样式和非行间样式
- 购物车源码
- js打印指定局部页面