2013-07-02 17 views
6

używam PHP json_encode() wrócić niektóre dane, pobierane przez jQuery ajax():json_encode tworzenia nieprawidłowy JSON (dodatkowo ukryty znak)

uproszczonym JS:

$.ajax({ 
    dataType: 'json', 
    contentType: 'application/json', 
    cache: false, 
    type: 'POST', 
    url: './api/_imgdown.php', 
    error: function(jqXHR, textStatus, errorThrow) { 
     console.log(jqXHR, textStatus, errorThrow); 
    }, 
    success: function(data, textStatus, jqXHR) { 
     console.log(data, textStatus, jqXHR); 
    } 
}); 

PZP jest:

header('Content-Type: application/json; charset=UTF-8'); 
//default apiResponse 
$apiResponse = [ 
    "status" => 1, 
    "message" => "success", 
    "data" => null 
]; 

Potem, gdy php działa mój kod, to kończy się dodając te dane:

$apiResponse['data'][] = [ 
    "mid" => (int)$mid, 
    "card_type" => $card_type, 
    "header_size" => (int)$headers['Content-Length'], 
    "saved_size" => (int)filesize($imgSavePath), 
    "saved_path" => $imgSavePath 
]; 
//spit out the JSON 
echo json_encode($apiResponse); 
exit(); 

JSON:

{"status":1,"message":"success","data":[{"mid":340052,"card_type":"kakusei","header_size":48337,"saved_size":48337,"saved_path":"..\/card\/kakusei\/340052.png"}]} 

Początkowo wydaje się ważne. Mój Ajax, który pobiera ten PHP, zawsze kończy się parseerror (przechodząc do części error z ajax()).

Jeśli skopiujesz i wkleisz ten JSON pod numer http://jsonlint.com/, pojawi się komunikat "Nieoczekiwany token", a http://jsonformatter.curiousconcept.com/ jest nieprawidłowe.

Próbowałem już echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES); mimo że uciekanie ukośników jest ok. \/, ale nie miało to żadnego znaczenia.

Ale co nie jest dokładnie poprawne? Czy PHP nie powinno zwracać poprawnego JSON?

Dodatkowe info: Testowanie na Windows7, Chrome v28.XX, używając PHP 5.4.XX na Apache

Pytania Czytałem przed faktycznie opublikowania tego:


Aktualizacja:

Kopiowanie z SO w JSONlint daje poprawny JSON. Zbadałem więc trochę dalej i zauważyłem, że PHP tworzy dziwną ukrytą postać, która w rzeczywistości czyni json nieważnym. Zobacz poniżej zrzut ekranu. Jak to naprawić? json invalid character

+0

JSONLint pokazuje, że jest dobry. –

+0

Twój json jest ważny, a twój php jest ważny. Zgaduję, że to twoje połączenie ajaxowe. Spróbuj użyć '$ .getJSON' prostszego wywołania ajaxowego dla zapytania json – sircapsalot

+0

Jego wyświetlenie jest poprawne na jsonlint. –

Odpowiedz

8

Może to być problem ze znakiem BOM. Spróbuj zapisać plik w zwykłym formacie UTF-8.

+1

Tak, jak pomogłeś dowiedzieć się, było BOM char "65279". Znalazłem inne pytanie z tym problemem http://stackoverflow.com/questions/6538203/how-to-avoid-echoing-character-65279-in-php-this-question-also-relates-to-java Problem jest to, że potrzebuję BOM, ponieważ 'card_type' może mieć znaki alfabetu łacińskiego, takie jak' ééã', które nie są zakodowane w encje HTML, co powoduje błędy podczas zapisywania bez 'BOM'. Zapiszę jak zwykle UTF-8 i spróbuj użyć 'htmlentities()' i mam nadzieję, że zadziała. Dziękujemy za udzielenie odpowiedzi! – RaphaelDDL

+3

O mój Boże. Szukałem odpowiedzi na ten problem przez dwa dni ... Dzięki! :-) –

-1

Napotkałem ten sam problem, ale nie mogłem znaleźć, który plik w moim systemie Windows jest zapisany w UTF8 z BOM (Mimo że próbowałem przeszukiwać pliki tak dużo, jak tylko mogłem).

Jednak znalazłem obejście. Zakładając po stronie serwera Mam

die(json_encode(array(
    'OK' => 1 
))) 
  1. Z $.ajax połączeń, usunąć wpis "typ danych: 'json'" i mam dostępu do odpowiedzi z następującymi liniami:
success: function (response) { 
     var data = $.parseJSON(response); 
     console.log(data.OK); // = 1 
    } 
  1. Z $ .ajax wezwanie, nadal trzymać się wpis "typ danych: 'json'", to mam na odczytanie wartości wewnątrz odpowiedzi jak ten

var dataOK odpowiedzi = [ 'OK']; // = 1

Powiązane problemy