Philipp makes a good point about JSON. It is human readable and makes debugging network code easy. If you have no experience in programming network code, this would be the way to go. Yes, there is a lot of overhead by using JSON, but for small to medium data transfers, it should be more than enough. And like Alexandre Vaillancourt said, you can always compress data before sending it.
Faster and smaller
But if you want to optimize your network code to send the less data as possible for your game to use the less bandwidth (and be fast), then I would suggest using frames.
Let's say you want to send all the information you mentionned:
This is a player information packet. We need 16 bytes of data in the frame. For the server to be able to read that frame, we will need a header. Let's use 1 byte and say the player information packet is the frame with the id 1. You would then have a frame that looks like this:
0 1 (For player information packet)
1-4 X position (as an int)
5-8 Y position (as an int)
9-12 Angle (as a float)
13-16 State (as an int)
Wrap this in a UDP or TCP packet and send it. The server, when receiving it, would then read the first byte of data to extract the identifier, see that it's a player information packet, and know exactly how to read the remaining data.
About big games like Dota 2 and CS:GO
Don't even bother with this. They use highly sophisticated networking algorythms that are in almost no way applicable to small games people like you and I make. Keeping it simple is the key, because if you ever need to debug your packets (and trust me, you will, and a lot), you cannot call a team of 10 people specialized in network programming like Valve would do.