So the most correct way if any would probably be to make a http request in the controller, but what you are trying has its advantages, the comments have been kind of one one-sided so let me give another perspective.
Http request
If you get the data with http request there will be some time between the window is loaded and data request is complete. This will make the view to grow and you need to handle loading. In the matter of time there is a bit of overhead with a extra http request for data, but it's not noticeable. The worst part about this approach in my experience is SEO. Google should reportedly be able to handle javascript (Source) but I have some sites where this is not the case.
The best argument for this approach is that is the angular way and it's super easy at almost no cost, it can even be done asynchronous and gives the user a feeling of a fast loading page!
JSON served in view
Let me first start with some advantages. First, when the view is loaded the data is ready, which can be achieved in a more angular way as well but for the matter of the point, this is a gain. Another positive thing is the optimization with tour database. In some situation you have a connection open to your database, which can be used for getting the JSON data when you allready at it. If the initial load of data is heavy like above 2-3 seconds, I have had trouble with google crawler not "waiting" for the data. A great/bad thing is that your page will load slower, it will not grow, the data will seem instant to the user. This point is a matter of style your site is aiming for.
Another usecase which is why I've used it occasionally is to get your CMS content nodes into your angular. Ex to make a extremely fast language change (very slim use-case).
The problems: It's not the angular way (when I say this, I mean, there is not much help on the web and your code will seem confusing to outsiders) and it's much harder. So you should not do as you suggest with:
<script>
var json = [json_variable]
</script>
Don't save it as a global variable and you get some timing issues. You can't be sure if the script is loaded before the controller and if the controller is depending on the value you have timing issues. Extra you make yourself depended on jQuery to load the script, you can get around this problem but it's alot of internet searching and extra code.
You could use ngInit to solve this like:
<div ng-init="controllersInitFunction(json)">
...
</div>
Angular would understand the object and you can control the timing.
I just wanted to say it's not all clear as the others might have stated. I my self use the angular way, because it's just way easier and introducing a new developer doesn't make him too confused, but it's not the only way.
Sry for the wall of text.