If you want to add a lot of tags, it may be better to make them into a std::set instead. Or if you need speed, std::bitfield.
std::set is straightforward to use, the only semi-challenging part is loading it from a json. However this is already solved in src/item_factory.cpp, so you can just copy some functions and repurpose them.
std::bitfield is a bit harder to use (and also a bit more tedious), but it’s still nothing advanced. Vehicle and monster code uses it a lot: whenever you see things like VPFLAG_AISLE, it’s actually an index for the bitfield.
With either of those (or both at once, like in vehicle code), you’d have a nice and clean way to test everything rather than a big block of if-else.