2013-07-19 1 views
7

json_decode가받는 특정 문자열에서 작동하는 데 문제가 있습니다.PHP, JSON 디코드의 문자가 잘못되었습니다.

나는이 라인을 좁혀

:

"systemNotes [6]": "2013년 1월 9일 오후 12시 52분 - 테스트 이름 - 변경 대금 청구 주소 2 배송 이름을 올린 사람 : 배송 성 : 이메일 주소 : 배송 주소 : 배송 주소 2 : 배송 도시 : 배송 우편 번호 : 배송 국가 : 배송 상태 : 전화 : 청구 이름 : 청구 이름 : 청구 주소 2 : 청구 C :

이 질문에서 json을 복사하면 문제는 재현 할 수 없지만 원래 json의 대표 스 니펫 여기에 있습니다 : http://codepad.org/ZzrC7rqQ - 그리고 jsonlint.com에 있다고 퍼팅 제공 :

Parse error on line 3: 
... "systemNotes[6]": "January 09, 2013 12 
-----------------------^ 
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[' 

그것이 잘못된 JSON의도록이 문자열에 어떤 문제가 있습니까?

편집 나는 정확한 코드가 건너 오는 찾을 수 있었다.

"1 월 +09 % 2C + 2013 + 12 % 3A52 + PM + - 첫 번째 + 이름 + - + 변경된 ++ 결제 + 주소 + 2 + ++에서 + 배송 + 첫 번째 + 이름 % 3A % 09 + 해운 + 마지막 + 이름 % 3A % 09 + 이메일 + 주소 % 3A % 09 + 해운 + 주소 % 3A + % 09 + 해운 + 주소 + 2 % 3A + % 09 + 해운 + 도시 % 3A + % 09 + 배송 + 우편 번호 % 2FPostal % 3A + % 09 + 배송 + 컨트리 % 3A + % 09 + 배송 + 주 % 3A + % 09 + 전화 3A + % 09 + 결제 + 처음 + 이름 % 3A + % 09 + 3A + % 09 + 대금 + 주소 %의 3A + % 09 + 대금 + 주소 + 2 % 3A + %이 그래서 아마 문제가 내가 parse_str을 수행 할 때에서 오는 괜찮을 것 같습니다 09 + 대금 + C "

, 여기에 제가 사용하고있는 코드가 있습니다 :

$response = apiConnection($data); 
parse_str($response, $parse); 
$each = json_decode($parse['data']); 
foreach($each as $key => $order){ 
    //do something 
} 
+0

을 어떻게 문자열을 수집하는? – aynber

+0

API를 쿼리하고 문자열로 다시 전송합니다. 다음 배열에 parse_str을 사용하고 있습니다. – Scott

+1

문자열에 비 UTF 8 문자가 있는지 확인할 수 있습니까? –

답변

8

문제는 탭 문자가 문자열 내에서 유효하지 않다는 것입니다.

여기서 http://codepad.org/8fnQphkS과 같은 탭 문자를 제거하고 jsonlint.com에서 탭 문자를 제거하면 유효한 json이 표시됩니다.

는 탭 문자가 문자열 내부의 경우 이스케이프해야합니다 문자 중 하나로 이름으로 불려 http://www.ietf.org/rfc/rfc4627.txt?number=4627 특별 섹션 2.5에서 JSON에 대한 사양에서보세요.

편집 :

여기

모든 탭과 여러 공간을 제거하고 하나의 공백 문자로 대체하는 방법 :

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data)); 
+0

그는 URL 인코딩을 제거하기 전에 json *을 디코딩하는 것이 더 낫습니다. –

+1

'$ data = preg_replace ('/ [\ s] + | [\ t] /', 'trim ($ data));'모든 공백 문자 유형 – ASDi

4

그런 식으로 시도해 보셨나요? 그것은

$yourstring = preg_replace('/[^(\x20-\x7F)]*/','', $yourstring); 
-1

이 json_decode하는 두 번째 매개 변수로 true를 전달하려고 당신의 문자열 청소 도움이 될 것이다. Documentation에 따르면 두 번째 인수가 true 인 개체 대신 연결 배열을 반환합니다.

$each = json_decode($parse['data'], true); 
+0

이 플래그는 배열 또는 std 클래스를 검색하는 것에 관한 것입니다. – HMagdy

관련 문제