React Js: Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

JavascriptJsonAjaxReactjs

Javascript Problem Overview


I want to fetch my Json file in react js, for this I am using fetch. But it shows an error

Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

What could be the error, i am getting no clue. I even validated my JSON.

handleGetJson(){
  console.log("inside handleGetJson");
  fetch(`./fr.json`)
    .then((response) => response.json())
    .then((messages) => {console.log("messages");});
}

My Json (fr.json)

{
  "greeting1": "(fr)choose an emoticon",
  "addPhoto1": "(fr)add photo",
  "close1": "(fr)close"
}

Javascript Solutions


Solution 1 - Javascript

Add two headers Content-Type and Accept to be equal to application/json.

handleGetJson(){
  console.log("inside handleGetJson");
  fetch(`./fr.json`, {
      headers : { 
        'Content-Type': 'application/json',
        'Accept': 'application/json'
       }

    })
    .then((response) => response.json())
    .then((messages) => {console.log("messages");});
}

Solution 2 - Javascript

The solution that worked for me is that:- I moved my data.json file from src to public directory. Then used fetch API to fetch the file.

fetch('./data.json').then(response => {
          console.log(response);
          return response.json();
        }).then(data => {
          // Work with JSON data here
          console.log(data);
        }).catch(err => {
          // Do something for an error here
          console.log("Error Reading data " + err);
        });

The problem was that after compiling react app the fetch request looks for the file at URL "http://localhost:3000/data.json" which is actually the public directory of my react app. But unfortunately while compiling react app data.json file is not moved from src to public directory. So we have to explicitly move data.json file from src to public directory.

Solution 3 - Javascript

This error can be received but be aware it can be a red herring to the real issue. In my case, there wasn't an issue with the JSON as the error states, but rather a 404 was occurring that it could not pull the JSON data to process in the 1st place thus resulting in this error.

The fix for this was that in order to use fetch on a .json file in a local project, the .json file must be accessible. This can be done by placing it in a folder such as the public folder in the root of the project. Once I moved the json file into that folder, the 404 turned into a 200, and the Unexpected token < in JSON at position 0 error was resolved.

Solution 4 - Javascript

I was getting the same error, for me, it was because API was just returning a string however in fetch call I was expecting json :

response => response.json()

Returning json from API resolved the issue for me, if your API is not supposed to return json then simply don't do response.json()

Solution 5 - Javascript

I also had the same issue when trying to fetch the data from "/src" folder. Moving the file into the "/public" solved the problem for me.

Solution 6 - Javascript

I had the same issue with fetch and decided to switch to axios. Fixed the issue right away, here's the code snippet.

var axios = require('axios');

  var config = {
    method: 'get',
    url: 'http://localhost:4000/'
  };
  
  axios(config)
  .then(function (response) {
    console.log(JSON.stringify(response.data));
  })
  .catch(function (error) {
    console.log(error);
  });

Solution 7 - Javascript

I had the same issue although I was requesting data from another web server and not locally. The response status code was 200 but I still didnt get the data, even though it was sent in JSON format by default. The (simple) problem was that I had forgot to include 'https://' in the url, so instead it used the local host in the beginning.

Solution 8 - Javascript

on your Promise response you requested

response.json() 

but this works well if your server sends json response in return especially if you're using Node Js on the server side

So check again and make sure your server sends json as response as said if its NodeJS the response could be

res.json(YOUR-DATA-RESPONSE)

Solution 9 - Javascript

I confirm some methods proposed here that also worked for me : you have to put your local .json file in your public directory where fetch() is looking for (looking in http://localhost:3000/) for example : I use this fetch() in my src/App.js file:

componentDidMount(){
  fetch('./data/json-data.json')
  .then ( resp1 => resp1.json() )
  .then ( users1 => this.setState( {cards : users1} ) )
}

so I created public/data/json-data.json

and everything was fine then :)

Solution 10 - Javascript

Sometime you API backend could not respect the contract, and send plain text (ie. Proxy error: Could not proxy request ..., or <html><body>NOT FOUND</body></html>).

In this case, you will need to handle both cases: 1) a valid json response error, or 2) text payload as fallback (when response payload is not a valid json).

I would suggest this to handle both cases:

  // parse response as json, or else as txt
  static consumeResponseBodyAs(response, jsonConsumer, txtConsumer) {
    (async () => {
      var responseString = await response.text();
      try{
        if (responseString && typeof responseString === "string"){
         var responseParsed = JSON.parse(responseString);
         if (Api.debug) {
            console.log("RESPONSE(Json)", responseParsed);
         }
         return jsonConsumer(responseParsed);
        }
      } catch(error) {
        // text is not a valid json so we will consume as text
      }
      if (Api.debug) {
        console.log("RESPONSE(Txt)", responseString);
      }
      return txtConsumer(responseString);
    })();
  }

then it become more easy to tune the rest handler:

class Api {
  static debug = true;

  static contribute(entryToAdd) {
    return new Promise((resolve, reject) => {
      fetch('/api/contributions',
        { method: 'POST',
          headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
          body: JSON.stringify(entryToAdd) })
      .catch(reject);
      .then(response => Api.consumeResponseBodyAs(response,
          (json) => {
            if (!response.ok) {
              // valid json: reject will use error.details or error.message or http status
              reject((json && json.details) || (json && json.message) || response.status);
            } else {
              resolve(json);
            }
          },
          (txt) => reject(txt)// not json: reject with text payload
        )
      );
    });
  }

Solution 11 - Javascript

Try converting the response to string and then parse it to JSON. This solves the error for me. Below is the code for the same.

let resp = JSON.stringify(response);
res = JSON.parse(resp);

Solution 12 - Javascript

It may come when the API(you are consuming) is not sending the corresponding JSON. You may experience the response as 404 page or something like HTML/XML response.

Solution 13 - Javascript

I had the .json file in src folder. Simply moved it in the public folder and it worked

Solution 14 - Javascript

I struggled with the same issue but then found a solution after doing some research. The issue sometimes arises from a typing error. Your console lets you know the type of error.

Here's is how I found out: In settings.py I wrote a double underscore: CORS__ORIGIN_ALLOW_ALL = True instead of CORS_ORIGIN_ALLOW_ALL = True.

The issues persisted and I changed this 'the API Fetch method' and it worked just fine:

refreshList() {
  fetch(process.env.REACT_APP_API+ "department")
    .then((response) => response.json())
    .then((data) => {
      this.setState({ deps: data });
    });
}

to:

refreshList() {
  fetch("http://127.0.0.1:8000/" + "department")
    .then((response) => response.json())
    .then((data) => {
      this.setState({ deps: data });
    });
}

Solution 15 - Javascript

For me, I was making a call with fetch from a new computer and I forgot to add the env file to populate the process.env.REACT_APP_URL and process.env.REACT_APP_API_KEY fields. Adding back the .env file resolved the issue.

Solution 16 - Javascript

Add "method: 'GET'"

let query = {
      method: 'GET',
      headers: {
        authToken: token,
        "Content-Type": "application/json",
    },
 };

Solution 17 - Javascript

With datas in public/datas/datas.json :

export default class App extends React.Component {
	constructor(props) {
		super(props);
	}
	async componentDidMount() {
		const response = await fetch("datas/datas.json");
		const datas = await response.json();
		console.log(datas);
	}
...

Solution 18 - Javascript

I was getting the error. I simply added "proxy" in my package.json and the error went away. The error was simply there because the API request was getting made at the same port as the react app was running. You need to provide the proxy so that the API call is made to the port where your backend server is running.

Solution 19 - Javascript

Mostly this is caused with an issue in your React/Client app. Adding this line to your client package.json solves it

> "proxy": "http://localhost:5000/"

Note: Replace 5000, with the port number where your server is running

Reference: How to get create-react-app to work with a Node.js back-end API

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioniamsakshamView Question on Stackoverflow
Solution 1 - JavascriptAbdennour TOUMIView Answer on Stackoverflow
Solution 2 - JavascriptAkash Kumar SethView Answer on Stackoverflow
Solution 3 - JavascriptatconwayView Answer on Stackoverflow
Solution 4 - JavascriptSiddharth SachdevaView Answer on Stackoverflow
Solution 5 - JavascriptAbdulsalamView Answer on Stackoverflow
Solution 6 - JavascriptMarina KimView Answer on Stackoverflow
Solution 7 - JavascriptalexanderysView Answer on Stackoverflow
Solution 8 - JavascriptndotieView Answer on Stackoverflow
Solution 9 - JavascriptCyberChrisView Answer on Stackoverflow
Solution 10 - Javascriptboly38View Answer on Stackoverflow
Solution 11 - JavascriptSAKSHI GOYALView Answer on Stackoverflow
Solution 12 - JavascriptAshraf ZamanView Answer on Stackoverflow
Solution 13 - JavascriptiGotInTroublesView Answer on Stackoverflow
Solution 14 - JavascriptMichael AkooloView Answer on Stackoverflow
Solution 15 - JavascriptJames ShapiroView Answer on Stackoverflow
Solution 16 - JavascriptPunit kashyapView Answer on Stackoverflow
Solution 17 - JavascriptwebewView Answer on Stackoverflow
Solution 18 - JavascriptParvarishView Answer on Stackoverflow
Solution 19 - JavascriptJeanView Answer on Stackoverflow