Check out what the specification says about JSON and eval
http://www.json.org/js.html
Notice this part specifically
The eval function is very fast. However, it can compile and execute
  any JavaScript program, so there can be security issues. The use of
  eval is indicated when the source is trusted and competent. It is much
  safer to use a JSON parser. In web applications over XMLHttpRequest,
  communication is permitted only to the same origin that provide that
  page, so it is trusted. But it might not be competent. If the server
  is not rigorous in its JSON encoding, or if it does not scrupulously
  validate all of its inputs, then it could deliver invalid JSON text
  that could be carrying dangerous script. The eval function would
  execute the script, unleashing its malice.
JSON is just a javascript object, and nothing more. Valid javascript could include functions, execution blocks, etc. If you just eval() a string, it could have code it in. JSON will parse if it's just JSON, but you can't know for sure by just stuffing it into eval. For example
var s = "(function(){ /* do badStuff */ return {s: 123, t: 456}; })()";
var result = eval(s);
Would give you a var result with the contents {s: 123, t: 456} but would also execute any code hidden in your function. If you were taking this input from elsewhere, code could be executing and not actually break anything on your end. Now the same example with JSON.parse
var result = JSON.parse(s);
It throws an error with the message:
Uncaught SyntaxError: Unexpected token ( 
So the parse saves you from remote code execution here, even if someone tried to sneak it in.