您的位置:首页 > Web前端 > JavaScript

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: