vdf icon indicating copy to clipboard operation
vdf copied to clipboard

Nested groups with duplicate keys trivially do not work, even with VDFDict

Open GiovanH opened this issue 2 years ago • 2 comments

Input file demo.vdf:

"controller_mappings"
{
	"group"
	{
		"id"		"0"
	}
	"group"
	{
		"id"		"1"
	}
}

Test script:

import vdf
with open("demo.vdf") as fp:
    v = vdf.load(fp, mapper=vdf.VDFDict)
    print(type(v))
    print(type(v['controller_mappings']))
    print(vdf.dumps(v, pretty=True))

Expected output: (demo.vdf)

Actual output:

<class 'vdf.vdict.VDFDict'>
<class 'vdf.vdict.VDFDict'>
"controller_mappings"
{
        "group"
        {
                "id" "0"
                "id" "1"
        }
}

Not only is this incorrect, but no error is thrown: the resulting data structure is silently malformed and passed along.

GiovanH avatar Jan 09 '24 03:01 GiovanH

Did you try setting merge_duplicate_keys=False ? The default behaviour is to merge duplicate keys.

See https://github.com/ValvePython/vdf/blob/d76292623e326fb165fe3bdb684832cdf30959d4/vdf/init.py#L77-L79

rossengeorgiev avatar Aug 26 '24 11:08 rossengeorgiev

Since this has been open for quite a while, and I've also come across this. It seems that merge_duplicate_keys only applies when loading a file, not when dumping it. If you want to preserve key order but remove duplicates in a dump, you'll have to use collections.OrderedDict as the mapper when loading the file.

jericjan avatar Oct 29 '25 02:10 jericjan