SyntaxError : JSON 위치 1의 예기치 않은 토큰 o


139

컨트롤러의 유형 클래스를 사용하여 몇 가지 데이터를 구문 분석합니다. 다음과 같이 데이터를 얻습니다.

{  
   "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"
}

이렇게 데이터를 저장하려고했습니다

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

사용자 목록을 새 변수로 추출하려면 어떻게해야합니까?


11
을 사용할 필요가 없습니다 JSON.parse. userData개체로 직접 사용해보십시오 .
Mohit Bhardwaj

13
경우 console.log(typeof userData)object당신은 이미 JSON 문자열 자바 스크립트 객체와하지가 당신은 구문 분석 할 필요가있다.
t.niese jul.

1
@MohitBhardwaj 예, 필요 구문 분석에 필요하지 ..
Soniya 모한

5
일반적으로이 오류가 발생할 때마다- Unexpected token o in JSON, 아마도 이미 구문 분석 된 형식의 객체를 구문 분석하려고 할 것입니다.
Mohit Bhardwaj의

트윗 담아 가기
Soniya 모한

답변:


191

게시 한 JSON은 괜찮아 보이지만 코드에서는 더 이상 JSON 문자열이 아니라 이미 JavaScript 객체 일 가능성이 높습니다. 즉, 더 이상 구문 분석이 필요하지 않습니다.

예를 들어 Chrome 콘솔에서 직접 테스트 할 수 있습니다.

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()입력을 문자열로 변환합니다. toString()기본적으로 JavaScript 객체 의 메서드는를 반환 [object Object]하여 관찰 된 동작을 발생시킵니다.

대신 다음을 시도하십시오.

var newData = userData.data.userList;

1
그래서 이것은 모든 종류의 브라우저에 적용 할 수 있습니까?
comeOnGetIt

@Timo이 링크를 볼 수 있습니다.
V SH

때때로이 오류는 요청을 제공하는 api url 엔드 포인트의 코드 또는 기타 포함되거나 사용 된 파일에 오류가 있고 처리되거나 기록되지 않은 오류가 발생할 때 나타날 수 있습니다. 대부분 브라우저 개발자 도구의 네트워크 탭을 보거나 포스트 맨을 사용하여 엔드 포인트에 도달하여 무엇이 나타나는지 확인할 수 있습니다.
MuturiAlex

65

함수의 첫 번째 매개 변수는 JSON.parse문자열이어야하고 데이터는 자바 스크립트 객체이므로 문자열로 변환되므로 데이터를 전달하기 전에 [object object]사용해야 JSON.stringify합니다.

JSON.parse(JSON.stringify(userData))

1
큰 도움이 된 형제. 감사합니다 :)
Anand_5050

솔루션에 감사드립니다.
Nag Arjun

당신은 내 하루를 구했습니다. 감사합니다 :)
Dwarkesh Soni

문자열에 큰 따옴표가 포함되어 있으면 작동하지 않습니다. 해결책이 있습니까?
Mr S Coder

23

블록으로 JSON.parse감싸지 않고 사용 하지 마십시오 try-catch.

// 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

7
이것은 실제로 질문에 대한 답은 아니지만 예외 처리 부족에 대한 의견입니다.
Richard Duerr

2
@RichardDuerr, 그러나 이것은 헤드 토픽의 오류를 수정하는 데 도움이 될 것입니다. ie SyntaxError : 위치 1의 JSON에서 예기치 않은 토큰 o
Niko Jojo

6
그것은 단순히 오류를 숨기지 만 실제로 해결하지는 않습니다.
Richard Duerr

21

바로 위에 다음 JSON.parse을 사용하십시오.

var newData = JSON.stringify(userData)

4
JSON.stringify()JavaScript 개체를 문자열 표현으로 변환합니다. 이는 수행하는 작업과 반대입니다 JSON.parse(). SyntaxError이미 객체 인 것을 구문 분석하려고했기 때문에을 얻었습니다 . @Sukhchain의 솔루션에서는이를 피하기 위해 문자열로 변환됩니다.
Hubert

1
단점은 결국 JSON.parse()너무 많이 중복 사용 한다는 것입니다. 매우 빠른 프로세스이지만 JSON 구문 분석은 동 기적으로 수행되며 잠재적으로 UI를 차단할 수 있으므로 사용하지 않는 것이 좋습니다. 대신 변수가 객체인지 확인할 수 있습니다 (예 : typeof(userData) === 'object'구문 분석을 시도하기 전에을 사용).
Hubert

2

글쎄, 나는 다음과 같이 객체를 구문 분석해야 함을 의미했습니다 var jsonObj = {"first name" : "fname"}. 하지만 실제로는 그렇지 않습니다. 이미 JSON이기 때문입니다.


2

다음과 같은 검사를 추가 할 수도 있습니다.

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

    return {};
}

1

JSON 데이터 또는 문자열이 구문 분석 될 때 예기치 않은 'O'오류가 발생합니다.

문자열이면 이미 문자열입니다. 구문 분석은 예기치 않은 'O'오류로 끝납니다.

나는 비슷한 상황에 직면했지만 (다른 맥락에서도) JSON Producer를 제거하여 다음 오류를 해결했습니다.

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

  }

응답에는 "OK" 문자열 반환이 포함됩니다. @Produces ({** MediaType.APPLICATION_JSON }) ** 로 표시된 주석은 문자열을 JSON 형식으로 구문 분석하여 예기치 않은 'O'가 발생 합니다.

@Produces ({ MediaType.APPLICATION_JSON }) 제거가 제대로 작동합니다. 출력 : OK

주의 : 또한 클라이언트 측에서 ajax 요청을하고 JSON.parse ( "OK")를 사용하면 예기치 않은 토큰 'O'가 발생합니다.

O 는 문자열의 첫 글자입니다.

JSON.parse (object)는 jQuery.parseJSON (object)과 비교됩니다.

JSON.parse ( '{ "name": "Yergalem", "city": "Dover"}'); --- 잘 작동

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.