2016-04-19 10 views
1

Json-Cには、このように不完全で、文書化されていないリファレンスカウントがあり、問題が生じています。特に、私たちは子供を含むオブジェクトを持っており、特定の子供をjson_object_object_addは既存のエントリを置き換えることができますか?

json_object_object_add(parent, "child name", new_child)と置き換えたいと考えています。

ここではの所有権はnew_childになりますが、問題はありません。しかし、古い子供はどうですか? json_object_object_deldoesn't delete the old child (but leaks it))で手動で削除できます。だから、次のソリューションは、適切な代替品です表示されます。

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は、最初の3つのステップを冗長にするために十分にスマートである場合は、私たちは迷っています。原子置換を好むので、これはより良い設計になります。何らかの理由で新しい子を追加できない場合は、古い子を保つ必要があります。

答えて

1

バージョン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; 
} 
関連する問題