SyntaxError: Unexpected token o in JSON at position 1

JavascriptAngularjsJson

Javascript Problem Overview


I'm parsing some data using a type class in my controller. I'm getting data as follows:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

I tried to store the data like this

var userData = _data;
var newData = JSON.parse(userData).data.userList;

How can I extract the user list to a new variable?

Javascript Solutions


Solution 1 - Javascript

The JSON you posted looks fine, however in your code, it is most likely not a JSON string anymore, but already a JavaScript object. This means, no more parsing is necessary.

You can test this yourself, e.g. in Chrome's console:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse() converts the input into a string. The toString() method of JavaScript objects by default returns [object Object], resulting in the observed behavior.

Try the following instead:

var newData = userData.data.userList;

Solution 2 - Javascript

The first parameter of the JSON.parse function is expected to be a string, and your data is a JavaScript object, so it will coerce it to the string "[object Object]". You should use JSON.stringify before passing the data:

JSON.parse(JSON.stringify(userData))

Solution 3 - Javascript

Don't ever use JSON.parse without wrapping it in try-catch block:

// payload 
let userData = null;

try {
	// Parse a JSON
	userData = JSON.parse(payload);	
} catch (e) {
	// You can read e for more info
	// Let's assume the error is that we already have parsed the payload
	// So just return that
	userData = payload;
}

// Now userData is the parsed result

Solution 4 - Javascript

Just above JSON.parse, use:

var newData = JSON.stringify(userData)

Solution 5 - Javascript

We can also add checks like this:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

Solution 6 - Javascript

You can simply check the typeof userData & JSON.parse() it only if it's string:

var userData = _data;
var newData;
if (typeof userData === 'object')
  newData = userData.data.userList; // dont parse if its object
else if (typeof userData === 'string')
  newData = JSON.parse(userData).data.userList; // parse if its string

Solution 7 - Javascript

Unexpected 'O' error is thrown when JSON data or String happens to get parsed.

If it's string, it's already stringfied. Parsing ends up with Unexpected 'O' error.

I faced similar( although in different context), I solved the following error by removing JSON Producer.

    @POST
	@Produces({ **MediaType.APPLICATION_JSON**})
	public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();
     
  }

The response contains "OK" string return. The annotation marked as @Produces({ MediaType.APPLICATION_JSON}) tries to parse the string to JSON format which results in Unexpected 'O'.

Removing @Produces({ MediaType.APPLICATION_JSON}) works fine. Output : OK

Beware: Also, on client side, if you make ajax request and use JSON.parse("OK"), it throws Unexpected token 'O'

O is the first letter of the string

JSON.parse(object) compares with jQuery.parseJSON(object);

JSON.parse('{ "name":"Yergalem", "city":"Dover"}'); --- Works Fine

Solution 8 - Javascript

Give a try catch like this, this will parse it if its stringified or else will take the default value

let example;
   try {
   example  = JSON.parse(data)
  } catch(e) {
    example = data
  }

Solution 9 - Javascript

First set request value in variable like:

let reqData = req.body.reqData;
if (reqData) {
  let reqDataValue = JSON.parse(JSON.stringify(reqData));
}

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
QuestionSoniya MohanView Question on Stackoverflow
Solution 1 - JavascriptTimoStaudingerView Answer on Stackoverflow
Solution 2 - JavascripthurujiView Answer on Stackoverflow
Solution 3 - JavascriptKoushaView Answer on Stackoverflow
Solution 4 - JavascriptSukhchainView Answer on Stackoverflow
Solution 5 - JavascriptPulkit chadhaView Answer on Stackoverflow
Solution 6 - Javascriptdeadcoder0904View Answer on Stackoverflow
Solution 7 - JavascriptYergalemView Answer on Stackoverflow
Solution 8 - JavascriptPran R.VView Answer on Stackoverflow
Solution 9 - JavascriptAjay PrajapatiView Answer on Stackoverflow