json-utils: fix overriding of non-container values when merging

Non-container values should always be overriden

Fixes: #653
This commit is contained in:
George Kiagiadakis
2024-05-03 15:54:37 +03:00
parent 0bd64f17af
commit e6a70db254
2 changed files with 9 additions and 2 deletions

View File

@@ -211,12 +211,12 @@ merge_json_objects (WpSpaJson *a, WpSpaJson *b)
g_return_val_if_fail (wp_iterator_next (it, &item), NULL);
val = g_value_dup_boxed (&item);
if (!override &&
if (!override && wp_spa_json_is_container (val) &&
(wp_spa_json_object_get (a, key_str, "J", &j, NULL) ||
wp_spa_json_object_get (a, override_key_str, "J", &j, NULL))) {
g_autoptr (WpSpaJson) merged = wp_json_utils_merge_containers (j, val);
if (!merged) {
wp_warning ("skipping merge of %s as JSON values are not compatible",
wp_warning ("skipping merge of %s as JSON values are not compatible containers",
key_str);
continue;
}

View File

@@ -241,6 +241,7 @@ assert (type (val.args.test) == "table")
assert (val.args.test[1] == 0)
assert (val.args.test[2] == 1)
-- merge
json = Json.Array { "foo" }
json2 = Json.Array { "bar" }
json = json:merge(json2)
@@ -263,3 +264,9 @@ assert (val["1"] == 1)
assert (val["2"] == 2)
assert (val["3"] == 3)
assert (val["4"] == 4)
json = Json.Object { ["a"] = "foo" }
json2 = Json.Object { ["a"] = "bar" }
json = json:merge(json2)
val = json:parse ()
assert (val["a"] == "bar")