从零开始的 JSON 库教程(八):访问与其他功能

82 阅读1分钟

代码地址: github.com/WangHao-nlp…

第八章在原有基础上进行完善, 增加了许多增删改查接口, 并对原来的json值里的数组和对象类型增加capacity属性。

leptjson.h

增加capacity属性

struct lept_value {
    union {
        struct { lept_member* m; size_t size, capacity; }o;  // 增加了容量
        struct { lept_value* e; size_t size, capacity; } a; 
        struct { char* s; size_t len; } s;       
        double n;
    }u;
    lept_type type;
};

增加的函数接口

// 复制、移动、交换
void lept_copy(lept_value* dst, const lept_value* src);
void lept_move(lept_value* dst, lept_value* src);
void lept_swap(lept_value* lhs, lept_value* rhs);

// 比较两个json值是否一样
int lept_is_equal(const lept_value* lhs, const lept_value* rhs);

void lept_set_array(lept_value* v, size_t capacity);  // 给数组分配内存
size_t lept_get_array_capacity(const lept_value* v);  // 获得数组内存
void lept_reserve_array(lept_value* v, size_t capacity);  // 将数组容量扩充到capacity,如果原来数组容量比capacity大,则无操作
void lept_shrink_array(lept_value* v);   // 收缩数组容量
void lept_clear_array(lept_value* v);    // 清空数组
lept_value* lept_pushback_array_element(lept_value* v); // 插入元素
void lept_popback_array_element(lept_value* v);  
lept_value* lept_insert_array_element(lept_value* v, size_t index);
void lept_erase_array_element(lept_value* v, size_t index, size_t count); // 删除元素

void lept_set_object(lept_value* v, size_t capacity);
size_t lept_get_object_capacity(const lept_value* v);
void lept_reserve_object(lept_value* v, size_t capacity);
void lept_shrink_object(lept_value* v);
void lept_clear_object(lept_value* v);
// 查询一个键值是否存在
size_t lept_find_object_index(const lept_value* v, const char* key, size_t klen);
lept_value* lept_find_object_value(lept_value* v, const char* key, size_t klen);
lept_value* lept_set_object_value(lept_value* v, const char* key, size_t klen);
void lept_remove_object_value(lept_value* v, size_t index);

leptjson.cpp

leptjson.cpp注释见github代码。

解析结果

教程8.png