@@ -1845,3 +1845,46 @@ class MyDataclass:
18451845 assert dataclasses .asdict (
18461846 s .validate_python ({'my_field' : 1 }, by_alias = runtime_by_alias , by_name = runtime_by_name )
18471847 ) == {'my_field' : 1 }
1848+
1849+
1850+ def test_dataclass_json_duplicate_keys ():
1851+ """Test that duplicate keys in JSON are handled correctly (last value wins).
1852+
1853+ We want to ensure that:
1854+ 1. The last value for a duplicate key is used (standard JSON behavior)
1855+ 2. We don't waste work creating Python objects for values that get overwritten
1856+ """
1857+
1858+ @dataclasses .dataclass
1859+ class MyDataclass :
1860+ name : str
1861+ age : int
1862+
1863+ schema = core_schema .dataclass_schema (
1864+ MyDataclass ,
1865+ core_schema .dataclass_args_schema (
1866+ 'MyDataclass' ,
1867+ [
1868+ core_schema .dataclass_field (name = 'name' , schema = core_schema .str_schema ()),
1869+ core_schema .dataclass_field (name = 'age' , schema = core_schema .int_schema ()),
1870+ ],
1871+ ),
1872+ ['name' , 'age' ],
1873+ )
1874+ v = SchemaValidator (schema )
1875+
1876+ # json with duplicate keys - the last value should win
1877+ json_with_duplicates = '{"name": "Alice", "age": 30, "name": "Bob", "age": 25}'
1878+ result = v .validate_json (json_with_duplicates )
1879+
1880+ assert result .name == 'Bob' , "Last value for 'name' should win"
1881+ assert result .age == 25 , "Last value for 'age' should win"
1882+ assert dataclasses .asdict (result ) == {'name' : 'Bob' , 'age' : 25 }
1883+
1884+ # test with multiple duplicates of the same key
1885+ json_multiple_duplicates = '{"name": "First", "age": 1, "name": "Second", "name": "Third", "age": 3}'
1886+ result2 = v .validate_json (json_multiple_duplicates )
1887+
1888+ assert result2 .name == 'Third' , 'Last value among multiple duplicates should win'
1889+ assert result2 .age == 3
1890+ assert dataclasses .asdict (result2 ) == {'name' : 'Third' , 'age' : 3 }
0 commit comments