Well, if you think you can make the json filed flexible enough while not making the code 100 times more complex... I mean, it should understand what slot and what type of item it affects, which stats it affects, and in some cases understand if the stat change provided by item is positive or negative.
That would be one hell of a system
Direct coding keeps logic clean, but also increases that amount of "ifs". It's still very readable, but I bet 6 "ifs" per trait is a blasphemy against pep8.