Problemem jest Same Origin Policy, czyli jedna z podstawowych polityk bezpieczeństwa w webie, która mówi, że domyślnie JavaScript ma dostęp tylko i wyłącznie do danych z tego samego kontekstu/źródła (ang. origin) definiowanego przez domenę (np. example.com) + port (np. 443) + protokół (np. HTTPS).
To znaczy tyle, że jeśli odpalasz Swój skrypt w kontekście https://example.com i w kodzie masz open na https://example.com/cośtam, to wszystko będzie działać. Ale jeśli zmienisz open na http://gynvael.coldwind.pl/cokolwiek, to działać przestanie (bo oba konteksty będą różne, więc dostęp zostanie zabroniony z uwagi na SOP).
Żeby umożliwić dostęp do różnych danych pomiędzy kontekstami serwer obcego kontekstu (tj. tego z którego JS próbuje pobrać dane) musi wyrazić na to zgodę poprzez wysłanie odpowiedniego nagłówka HTTP - nazywa się to Cross-Origin Resource Sharing (CORS) i jest dokładnie opisane np. na wiki - https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#Simple_example
Co oznacza mniej więcej tyle, że:
- Masz skrypt JS i plik JSON w różnych kontekstach.
- Nie "wysyłasz serwerem" odpowiednich nagłówków CORS dla JSONa.
Poprawić to możesz tez na dwa sposoby:
- Przenieść JSON na tą samą domenę+port+protokół w kontekście której uruchamiasz skrypt JS.
- Albo dodać nagłówki CORS po stronie serwera dla owego JSONa.