c-json_object_add可以替换现有条目

  • 本文关键字:替换 object add c-json c json-c
  • 更新时间 :
  • 英文 :


Json-C有这种笨拙且记录不足的引用计数,这给我们带来了问题。特别是,我们有一个包含子对象的对象,并希望用替换特定的子对象

CCD_ 1。

现在我们知道,这转移了new_child的所有权,这没有问题。但是那个老孩子呢?我们可以用json_object_object_del手动删除它,它不会删除旧的子项(但会泄露它)。因此,以下解决方案似乎是一个合适的替代方案:

json_object *manual = json_object_object_get(parent, "child name");
json_object_object_del(parent, "child name");
json_object_put(manual);
json_object_object_add(parent, "child name", new_child);

然而,我们想知道json_object_object_add是否足够聪明,可以使前三个步骤变得多余。这将是一个更好的设计,因为我们更喜欢原子替代品——如果由于任何原因无法添加新的孩子,我们应该保留旧的孩子。

在0.12版本中,您不必这么做。函数如下所示:

void json_object_object_add(struct json_object* jso, const char *key,
                struct json_object *val)
{
    // We lookup the entry and replace the value, rather than just deleting
    // and re-adding it, so the existing key remains valid.
    json_object *existing_value = NULL;
    struct lh_entry *existing_entry;
    existing_entry = lh_table_lookup_entry(jso->o.c_object, (void*)key);
    if (!existing_entry)
    {
        lh_table_insert(jso->o.c_object, strdup(key), val);
        return;
    }
    existing_value = (void *)existing_entry->v;
    if (existing_value)
        json_object_put(existing_value);
    existing_entry->v = val;
}

相关内容

  • 没有找到相关文章

最新更新