[JSON-C库的使用] Json对象数组的解析

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "json.h"

void encodeJson();
void decodeJson();

int main(int argc, char **argv)
{
    int ret = 0;

    encodeJson();

    decodeJson();

    return ret;
}

static char *json_type_to_name(int json_type)
{
    char json_type_name[128];

    memset(json_type_name, 0x00, sizeof(json_type_name));
    switch(json_type)
    {
        case json_type_null:
            snprintf(json_type_name, sizeof(json_type_name), "%s", "json_type_null");
            break;

        case json_type_boolean:
            snprintf(json_type_name, sizeof(json_type_name), "%s", "json_type_boolean");
            break;

        case json_type_double:
            snprintf(json_type_name, sizeof(json_type_name), "%s", "json_type_double");
            break;

        case json_type_int:
            snprintf(json_type_name, sizeof(json_type_name), "%s", "json_type_int");
            break;

        case json_type_object:
            snprintf(json_type_name, sizeof(json_type_name), "%s", "json_type_object");
            break;

        case json_type_array:
            snprintf(json_type_name, sizeof(json_type_name), "%s", "json_type_array");
            break;

        case json_type_string:
            snprintf(json_type_name, sizeof(json_type_name), "%s", "json_type_string");
            break;
    }

    return json_type_name;
}

static void getFieldValue(struct json_object *child_obj, const char *field)
{
    struct json_object *obj = json_object_object_get(child_obj, field);

    enum json_type obj_type = json_object_get_type(obj);
    //printf("%s json_type is %s\n", field, json_type_to_name(obj_type));

    if (obj_type == json_type_int)
    {
        printf("%s=%d\n", field, json_object_get_int(obj));
    }
    else if (obj_type == json_type_string)
    {
        printf("%s=%s\n", field, json_object_get_string(obj));
    }
}

void decodeJson()
{
    const char *json_string = "{ \n\
        \"userinfo\": [ \n\
        { \"pin\": \"10000\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10001\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10002\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10003\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10004\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10005\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10006\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10007\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10008\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 }, \n\
        { \"pin\": \"10009\", \"cardno\": \"123456789\", \"password\": \"123456\", \"name\": \"paul\", \"Privilege\": 14, \"flag\": 1 } \n\
        ] }";

    int ret = 0;
    int i = 0;
    struct json_object *root_obj = NULL;
    struct json_object *arry_obj = NULL;
    struct json_object *child_obj = NULL;
    struct lh_entry *entry = NULL;
    char *key = NULL;

    root_obj = json_tokener_parse(json_string);
    entry = json_object_get_object(root_obj)->head;
    if (entry)
    {
        key = (char *)entry->k;
        arry_obj = (struct json_object *)entry->v;

        if (json_type_array != json_object_get_type(arry_obj)
            && json_type_object != json_object_get_type(arry_obj))
        {
            return -1;
        }

        printf("key = %s\n", key);
        printf("array_obj = %s\n", json_object_to_json_string(arry_obj));

        if (json_type_array == json_object_get_type(arry_obj))
        {
            for(i = 0; i < json_object_array_length(arry_obj); i++)
            {
                child_obj = json_object_array_get_idx(arry_obj, i);
                //printf("child_obj = %s\n", json_object_to_json_string(child_obj));

                getFieldValue(child_obj, "pin");
                getFieldValue(child_obj, "cardno");
                getFieldValue(child_obj, "password");
                getFieldValue(child_obj, "name");
                getFieldValue(child_obj, "Privilege");
                getFieldValue(child_obj, "flag");
                printf("\n");
            }
        }
        else if (json_type_object == json_object_get_type(arry_obj))
        {

        }
    }

}

void encodeJson()
{
    int i = 0;
    struct json_object *root_obj = NULL;
    struct json_object *child_obj = NULL;
    struct json_object *array_obj = NULL;
    char *tmpStr = NULL;

    root_obj = json_object_new_object();
    array_obj = json_object_new_array();

    for(i = 0; i < 10; i++)
    {
        child_obj = json_object_new_object();

        json_object_object_add(child_obj, "pin", json_object_new_string("10000"));
        json_object_object_add(child_obj, "cardno", json_object_new_string("123456789"));
        json_object_object_add(child_obj, "password", json_object_new_string("123456"));
        json_object_object_add(child_obj, "name", json_object_new_string("paul"));
        json_object_object_add(child_obj, "Privilege", json_object_new_int(14));
        json_object_object_add(child_obj, "flag", json_object_new_int(1));

        json_object_array_add(array_obj, child_obj);
        child_obj = NULL;
    }

    json_object_object_add(root_obj, "userinfo", array_obj);

    tmpStr = json_object_to_json_string(root_obj);
    printf("%s\n", tmpStr);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值