2008-10-01 25 views
5

Interwebs nie są pomocne w tej sprawie. Kodujemy dane w ColdFusion przy użyciu serializeJSON i próbujemy je rozszyfrować w PHP używając json_decode. Przez większość czasu działa to dobrze, ale w niektórych przypadkach json_decode zwraca NULL. Szukaliśmy oczywistych winowajców, ale wydaje się, że serializeJSON formatuje rzeczy zgodnie z oczekiwaniami. Co jeszcze może być problemem?Ktoś ma problemy z metody serializeJSON ColdFusion do json_decode PHP?

AKTUALIZACJA: Kilka osób (mądrze) poprosiło mnie o opublikowanie wyniku, który jest przyczyną problemu. Zrobiłbym to, gdybyśmy tylko odkryli, że zestaw wyników zawiera wszystkie nasze dane (informacje o wykazie dla 2300+ obiektów wynajmu w sumie 561 535 znaków ASCII)! To może być problem, chociaż nie widziałem niczego w dokumentach PHP o maksymalnym rozmiarze ciągu. Jaki byłby tam czynnik ograniczający? BARAN?

UPDATE II: Wygląda na to, że kilku naszych użytkowników skopiowało i wkleiło tekst Microsoft Word z "inteligentnymi" cytatami. Ci nieznośni użytkownicy ...

+0

Czy masz przykład wyjścia JSON, który dekoduje do wartości NULL? – modius

+0

To jest świetne pytanie/problem. Czy miałeś szczęście to rozwiązać? Pamiętam, że te cytaty są zawsze zabójcze - np. spróbuj wysłać je w pamięci flash. Myślę, że używaliśmy MB do naprawy kodowania, a potem zadziałało, ale nie pamiętam. – Till

+0

cflib.org ma świetny "demoronizer" UDF do czyszczenia przypadkowych wstawek Word. –

Odpowiedz

1

Czy można skutecznie replikować ten problem? a jeśli tak, to możesz wysłać dane przykładowe, które zwracają wartość null? Jestem pewien, że wiesz o tym, ale dla informacyjnych sake dla innych potykających się o to, kto nie może, RFC 4627 opisuje JSON i powszechnym błędem jest założenie, że prawidłowy javascript jest prawidłowym JSON. lepiej myśleć o JSONie jako o podzbiorze javascript.

w odpowiedzi na EDIT:

chciałbym sugerujemy sprawdzenie aby upewnić się, że informacje są wypełniane w skrypcie PHP (przed jego były przekazywane off json_decode), a także sprawdzanie tych informacji (zwłaszcza jeśli może niezawodnie odtworzyć błąd). dla wygody możesz wypróbować model online validator. na podstawie bardzo ograniczonych informacji, które brzmią, jak być może upływa limit czasu i nie zbierają wszystkich danych? czy jest zapotrzebowanie na tak duży zbiór danych?

0

Możesz spróbować parsować go innym parserem i szukać błędu - wiem, że parsery JSON Pythona są bardzo wysokiej jakości. Jeśli masz zainstalowany Python, możesz łatwo uruchomić tekst za pomocą sprawdzania składni demjson. Jeśli jest to bardzo duży zbiór danych, możesz użyć mojej biblioteki jsonlib - użycie pamięci będzie większe niż w przypadku demjson, ale będzie działać szybciej, ponieważ jest napisane w C.

2

Możesz spróbować działać w UTF-8, a także pozwolić PHP poznaj ten fakt.

Miałem problem z PHP json_decode, który nie był w stanie odszyfrować łańcucha JSON UTF-8 (z pewnymi "dziwnymi" znakami innymi niż kręcone cytaty). Moim rozwiązaniem było wskazanie PHP, że pracowałem w trybie UTF-8, wstawiając metatag Content-Type na stronie HTML, która wykonywała zgłoszenie do PHP. W ten sposób rodzaj treści przedstawionych danych, który jest ciąg JSON, będzie również UTF-8:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> 

Po tym, PHP json_decode był w stanie poprawnie zdekodować ciąg.

1

Miałem ten dokładny problem i okazało się, że było to spowodowane tym, że ColdFusion nie umieszczał znaków drukowalnych w pakietach JSON (te znaki rzeczywiście istniały w naszych danych), ale nie mogą wejść do JSON.

Dwa pytania na tej stronie naprawiły ten problem dla mnie, chociaż wybrałem rozwiązanie PHP zamiast rozwiązania ColdFusion, ponieważ uważałem, że jest bardziej eleganckie z tych dwóch.

PHP solution

Fix ciąg zanim przejdzie on do json_decode()

$string = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string); 

ColdFusion solution

Użyj cleanXmlString() funkcja w tym SO pytanie po użyciu serializeJSON()

Powiązane problemy