Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: metoda json_decode()
Forum PHP.pl > Forum > PHP
inshua
Problem wygląda następująco:
za pomocą metody json_decode() chcę przetworzyć stringa np. tej postaci:
Cytat
[
{
"name": "Adam",
"age": "28",
"projects": [
"Shop",
"Website",
"Facebook"
]
},
{
"name": "Mark",
"age": "23",
"projects": [
"Website",
"Facebook"
]
},
{
"name": "Anna",
"age": "24",
"projects": [
"Facebook"
]
}
]


przykładowy kod wygląda tak:
  1. ($dane=json_decode($stringzjsonem,true))?$dane:$dane="NONE";
  2. $dane=print_r($dane,TRUE);


problem w tym, że $dane zawsze są = "NONE", dodam, że kodowanie wczytywanych do $stringzjsonem danych to utf-8
dobrze by było gdyby ktoś mnie chociaż naprowadził co jest nie tak?
com
przykład:
http://ideone.com/fuAn6U

Generalnie chodzi o to że musisz porównać do czegoś dane bo 1 wartość to jest warunek wiec albo nie rób tego tak albo spróbuj na zasadzie z przykładu wink.gif
inshua
@COM dzięki za wychwycenie błędu ;D faktycznie podstawowa pomyłka, ale akurat nie to jest istotą mojego wpisu.
Chodzi o to,że wykorzystanie metody json_decode() nawet w takiej postaci jak poniżej:
  1. $dane=json_decode(trim($stringzjsonem,true),true,512);
  2. $dane=print_r($dane,TRUE);

zawsze zwraca $dane=NULL.
dodam, że $stringzjsonem ładuję za pomocą file_get_contents($plik) i chyba coś jest nie tak z tym stringiem chociaż samo kodowanie pliku jest utf-8, to jednak te same dane podstawione wprost do zmiennej - działają, tj.zwracają wartość - a po załadowaniu z pliku już nie ;-/
vonski
Czyli jak zrobisz tak:
$dane = file_get_contents($plik_z_danymi);
to $dane będą miały wartość FALSE?
Masz włączone wyświetlanie komunikatów (włącznie z E_WARNING i E_NOTICE)?
inshua
@vonski
nie, sama metoda $stringzjsonem=file_get_contents($plik) zwraca, w tym przypadku, coś takiego:
Cytat
$stringzjsonem=' [ { "name": "Adam", "age": "28", "projects": [ "Shop", "Website", "Facebook" ] }, { "name": "Mark", "age": "23", "projects": [ "Website", "Facebook" ] }, { "name": "Anna", "age": "24", "projects": [ "Facebook" ] } ]'

natomiast po podstawieniu $dane=json_decode($stringzjsonem,true,512) $dane są pustym stringiem ;-/
mam włączone E_ALL
vonski
A to:

  1. var_dump(mb_detect_encoding($string_z_jsonem))


zwraca 'ASCII' czy 'UTF-8'? Czy coś innego?
I czy plik z JSON-em na pewno jest zakodowany w UTF-8 (bez BOM).

Ewentualnie, po wykonaniu json_decode($string_z_jsonem), co zwraca funkcja json_last_error?
ctom
@inshua może to głupie pytanie ... ale zwartością twojego pliku nie jest dokładnie to co zacytowałeś tylko to poniżej ?

Kod
  [ { "name": "Adam", "age": "28", "projects": [ "Shop", "Website", "Facebook" ] }, { "name": "Mark", "age": "23", "projects": [ "Website", "Facebook" ] }, { "name": "Anna", "age": "24", "projects": [ "Facebook" ] } ]
inshua
@vonski
-plik jest w utf-8 z BOM jak mi pokazuje notepad++
-mb_detect_encoding() zwraca 'UTF-8'
-json_last_error() zwraca code: 4 = 'JSON_ERROR_SYNTAX' czyli malformed JSON

@ctom
pytanie dobre bo być może na tym cała sprawa się zasadza, otóż w pliku mam to samo co podstawiam pod zmienną jako stringa, czyli jeżeli dam jako zmienną:
Cytat
$stringzjsonem=' [ { "name": "Adam", "age": "28", "projects": [ "Shop", "Website", "Facebook" ] }, { "name": "Mark", "age": "23", "projects": [ "Website", "Facebook" ] }, { "name": "Anna", "age": "24", "projects": [ "Facebook" ] } ]'

i użyję jej w $dane=json_decode($stringzjsonem,true,512) to $dane są prawidłowo zdekodowanym jsonem, natomiast jeżeli tego samego stringa wrzucę do pliku, czyli w pliku mam:
Cytat
[ { "name": "Adam", "age": "28", "projects": [ "Shop", "Website", "Facebook" ] }, { "name": "Mark", "age": "23", "projects": [ "Website", "Facebook" ] }, { "name": "Anna", "age": "24", "projects": [ "Facebook" ] } ]

i zapiszę jako utf-8, to po wczytaniu go za pomocą $stringzjsonem=file_get_contents($plik) a potem spróbuję $dane=json_decode($stringzjsonem,true,512) to już $dane są puste ;-/
coś robię nie tak?
vonski
Zamień kodowanie pliku z JSON-em na UTF-8 (bez BOM) - właśnie przez ten BOM masz JSON_ERROR_SYNTAX.
inshua
Yup, dzięki za pomoc!
Kurde już kiedyś miałem problem przez BOM ale zapomniałem o tym ;D
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.