In JSON you can do some interesting things with ammo like spawning an item when the projectile hits, like a grenade or a flare. You can also experiment with fields so a hit, say, spawns a bunch of smoke, or poison gas. If you actually want to make something that does something actually new and complex you need to hardcode it in C++.
Any weapon with 0 damage will automatically have a range of 0 (unless that was fixed) so that part is impossible. However, you could just give it 1 damage, which seems sensible if it’s just a needle full of poison. The hard part then is armor, because pretty much everything has a point or two of cutting armor, so you’ll need to either give it extra damage or some armor piercing. Reflecting off an enemy occurs when the projectile can’t penetrate the armor, unless I’m mistaken.
As far as poison is concerned, you might be able to have a projectile spawn an item that causes a poison gas for a turn, but that would be a little janky. Also, I don’t think most enemies are affected by poison.