Mam ten obiekt JSON przechowywany w zwykłym pliku tekstowym:
{
"MySQL": {
"Server": "(server)",
"Username": "(user)",
"Password": "(pwd)",
"DatabaseName": "(dbname)"
},
"Ftp": {
"Server": "(server)",
"Username": "(user)",
"Password": "(pwd)",
"RootFolder": "(rf)"
},
"BasePath": "../../bin/",
"NotesAppPath": "notas",
"SearchAppPath": "buscar",
"BaseUrl": "http:\/\/montemaiztusitio.com.ar",
"InitialExtensions": [
"nem.mysqlhandler",
"nem.string",
"nem.colour",
"nem.filesystem",
"nem.rss",
"nem.date",
"nem.template",
"nem.media",
"nem.measuring",
"nem.weather",
"nem.currency"
],
"MediaPath": "media",
"MediaGalleriesTable": "journal_media_galleries",
"MediaTable": "journal_media",
"Journal": {
"AllowedAdFileFormats": [
"flv:1",
"jpg:2",
"gif:3",
"png:4",
"swf:5"
],
"AdColumnId": "3",
"RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
"FrontendLayout": "Flat",
"AdPath": "ad",
"SiteTitle": "Monte Maíz: Tu Sitio",
"GlobalSiteDescription": "Periódico local de Monte Maíz.",
"MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.",
"TemplatePath": "templates",
"WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ",
"WeatherMeasureType": "1",
"CurrencySource": "cotizacion-monedas:Dolar|Euro|Real",
"TimesSingular": "vez",
"TimesPlural": "veces"
}
}
Kiedy próbuję go zdekodować json_decode()
, zwraca NULL. Czemu? Plik jest czytelny (próbowałem powtórzyć file_get_contents()
i zadziałało dobrze).
Przetestowałem JSON na http://jsonlint.com/ i jest całkowicie poprawny.
Co tu jest nie tak?
Rozwiązanie
Szukając odpowiedzi w Google, wróciłem do SO: json_decode zwraca NULL po wywołaniu usługi sieciowej . Mój plik JSON miał sekwencję UTF BOM (kilka znaków binarnych, których nie powinno tam być), co zrywa strukturę JSON. Poszedłem do Hex Editor, skasowałem bajty. Wszystko wróciło do normy. Dlaczego tak się stało? Ponieważ edytowałem plik za pomocą Notatnika Microsoft Windows. Okropny pomysł!
json_last_error()
.Odpowiedzi:
Może to być kodowanie znaków specjalnych. Możesz poprosić json_last_error () o uzyskanie konkretnych informacji.
źródło
json_last_error()
ponieważ jest to PHP 5.2.9. Ta funkcja pojawia się w PHP 5.3.0.utf8_decode()
najpierw przepuszczę tekst , pojson_decode()
cichu zawodzi.To zadziałało dla mnie
źródło
Mógłbyś z tym spróbować.
źródło
stripslashes()
dwa razy, co spowodowało usunięcie niezbędnych ukośników i spowodowanie nieprawidłowego ciągu JSON. Ta odpowiedź pomogła mi dostrzec błądJeśli zaznaczysz żądanie w chrome, zobaczysz, że JSON jest tekstem, więc do JSON został dodany pusty kod.
Możesz go wyczyścić, używając
$k=preg_replace('/\s+/', '',$k);
Następnie możesz użyć:
json_decode($k)
print_r
wyświetli tablicę.źródło
$k=preg_replace('/\s+/', ' ',$k);
Miałem ten sam problem i rozwiązałem go po prostu zastępując znak cudzysłowu przed dekodowaniem.
Moja wartość JSON została wygenerowana przez funkcję JSON.stringify.
źródło
Może jakieś ukryte postacie mieszają się z twoim jsonem, spróbuj tego:
źródło
zrobił to dla mnie. I tak, testowanie w Chrome. Dzięki dla użytkownika2254008
źródło
Pomyślałem, że to dodam, ponieważ napotkałem dziś ten problem. Jeśli istnieje dopełnienie ciągu znaków otaczających ciąg JSON, json_decode zwróci NULL.
Jeśli pobierasz JSON ze źródła innego niż zmienna PHP, dobrze byłoby najpierw go „przyciąć”:
źródło
pomoże ci to zrozumieć, jaki jest rodzaj błędu
źródło
Po prostu zaoszczędź trochę czasu. Spędziłem 3 godziny, aby dowiedzieć się, że to tylko problem z kodowaniem HTML. Spróbuj tego
źródło
Jak stwierdził Jürgen Math, metoda preg_replace wymieniona przez user2254008 naprawiła to również dla mnie.
Nie ogranicza się to do Chrome, wydaje się, że jest to problem z konwersją zestawu znaków (przynajmniej w moim przypadku Unicode -> UTF8). To rozwiązało wszystkie problemy, które miałem.
Jako przyszły węzeł, obiekt JSON, który dekodowałem, pochodzi z funkcji json.dumps języka Python. To z kolei spowodowało, że przedostały się inne niehigieniczne dane, chociaż można było się z nimi łatwo uporać.
źródło
Jeśli otrzymujesz json z bazy danych, wstaw
po zdefiniowaniu łącza połączenia $ con
źródło
Tutaj możesz znaleźć małe opakowanie JSON z działaniami naprawczymi, które rozwiązują problem z BOM i spoza ASCI: https://stackoverflow.com/a/43694325/2254935
źródło
W moim przypadku dzieje się tak z powodu pojedynczego cudzysłowu w ciągu JSON.
Format JSON akceptuje tylko podwójne cudzysłowy dla kluczy i wartości ciągów.
Przykład:
Jestem zdezorientowany ze względu na składnię Javascript. W Javascript oczywiście możemy zrobić tak:
ale później podczas konwersji tych obiektów na ciąg JSON:
źródło
Rozwiązałem ten problem, drukując JSON, a następnie sprawdzając źródło strony (CTRL / CMD + U):
Okazało się, że był końcowy
<pre>
tag.źródło
powinieneś upewnić się, że te punkty
1. Twój ciąg json nie zawiera żadnych nieznanych znaków
2. ciąg json może wyświetlać z przeglądarki json online (możesz wyszukiwać w Google jako przeglądarkę online lub parser dla json), powinien wyświetlać bez żadnego błędu
3. Twój ciąg nie ma jednostek html, powinien to być zwykły tekst / ciąg
wyjaśnienie punktu 3
to (usuń funkcję htmlentities ())
źródło
U mnie musiałem wyłączyć error_reporting , aby json_decode () działało poprawnie. Brzmi dziwnie, ale prawda w moim przypadku. Ponieważ między ciągiem JSON, który próbuję zdekodować, znajduje się informacja.
źródło
Najważniejszą rzeczą do zapamiętania, gdy uzyskasz wynik NULL z danych JSON, który jest prawidłowy, jest użycie następującego polecenia:
To znaczy.
Następnie napraw to za pomocą:
źródło
Więc html_entity_decode () zadziałało dla mnie. Spróbuj tego.
źródło
źródło