Json---实践
假设有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); } } }