@@ -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