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);
        }
    }
}

 



 

 

posted @ 2015-12-28 19:44  xfei.zhang  阅读(277)  评论(0编辑  收藏  举报