[php, js] json se chová jako string

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod ReZetFet 14. 9. 2015 17:39

Zdravím.

Kód PHP:
Kód: Vybrat vše
$rows = array();
while($r = mysqli_fetch_assoc($data)) {
    $rows[] = $r;
}
print json_encode($rows);

mi vrací
Kód: Vybrat vše
Data: [{"nazev":"a"},{"nazev":"b"},{"nazev":"c"}]
Status: success

skrze kód jQuery:
Kód: Vybrat vše
$.get("json-data.php", function(data, status){
   alert("Data: " + data + "\nStatus: " + status);
})

ale data [{"nazev":"a"},{"nazev":"b"},{"nazev":"c"}] se nedají použít jako json
ani když se pokusím o
Kód: Vybrat vše
var d= JSON.parse(data);


asi jsem něco přehledl a tak prosím o radu.
Dík
Naposledy upravil ReZetFet dne 14. 9. 2015 18:04, celkově upraveno 2
ReZetFet
Junior

Odeslat příspěvekod Wikan 14. 9. 2015 17:46

Co znamená, že se to nedá použít?
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod ReZetFet 14. 9. 2015 17:58

znamená to, že to končí chybou.
Ani jeden výstup není objekt
Kód: Vybrat vše
typeof data == 'object'
//nebo
var d= JSON.parse(data);
typeof d == 'object'
ReZetFet
Junior

Odeslat příspěvekod Wikan 14. 9. 2015 18:14

Opět, nešlo by to konkrétněji? Jakou chybou?
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod Just_jo 14. 9. 2015 18:17

U sebe jsem měl podobný problém - kvůli zastaralému PHP mám tuto fci
Kód: Vybrat vše
function my_json_encode($arr)
{
        //convmap since 0x80 char codes so it takes all multibyte codes (above ASCII 127). So such characters are being "hidden" from normal json_encoding
        array_walk_recursive($arr, function (&$item, $key) { if (is_string($item)) $item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); });
        return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8');

}
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod ReZetFet 14. 9. 2015 18:24

Wikan píše:Opět, nešlo by to konkrétněji? Jakou chybou?


Chybou je, že to není objekt tudíž to není datový typ aby se s ním jako JSONem dalo pracovat.
chová se to jako string (viz. tiulek)
ReZetFet
Junior

Odeslat příspěvekod Wikan 14. 9. 2015 18:30

Pokud je v proměnné "data" opravdu to, co jsi napsal, tak po rozparsování pomocí JSON.parse() už se s tím pracuje normálně jako s objektem. Vyzkoušel jsem si to a funguje. Takže je v té proměnné nejspíš něco jiného.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod Just_jo 14. 9. 2015 18:34

Není kontrola typu u JS se třemi rovnítky?
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod ReZetFet 14. 9. 2015 18:38

Just_jo píše:Není kontrola typu u JS se třemi rovnítky?

Já to psal z hlavy, ale testoval jsem to. i podle tutorialu w3schools.com

Wikan píše:Pokud je v proměnné "data" opravdu to, co jsi napsal, tak po rozparsování pomocí JSON.parse() už se s tím pracuje normálně jako s objektem. Vyzkoušel jsem si to a funguje. Takže je v té proměnné nejspíš něco jiného.


Pokud ty data uložím do proměnné:

Kód: Vybrat vše
var o = '[{"nazev":"a"},{"nazev":"b"},{"nazev":"c"}]';
var d = JSON.parse(o);
alert(d[0]);


tak to chybu nevyvolá
ReZetFet
Junior

Odeslat příspěvekod Wikan 14. 9. 2015 18:41

No však přesně to jsem psal. Pokud to takhle funguje a s použitím proměnné "data" ne, tak v té proměnné je něco jiného.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod ReZetFet 14. 9. 2015 18:47

v php to zakoduju
Kód: Vybrat vše
print json_encode($rows);

a zde ji vypisuju
Kód: Vybrat vše
$.get("json-data.php", function(data){
   alert(data);
})

během té doby s tím nemanipuluju.
pokud si spustím jen soubor json-data.php tak vypíše validní JSON
http://jsonlint.com/
stejně tak když ty data vypíšu přes ten alert.

obcházím to jako .load do divu s ID a přes .html to načítám a taky to funguje..
prostě skrze $.get se načítá nějaká chyba
ReZetFet
Junior

Odeslat příspěvekod Nargon 14. 9. 2015 19:50

Vím o tom kulový, ale možná je to "trochu" špatně. Tj jestli to tam nevrací třeba mezeru na začátku/konci, nebo co obsahuje hlavička té odpovědi. Hlavně MIME typ, co tam máš? defaultní variantu "text/html" nebo asi vhodnější "application/json" atd... tohle může hrát důležitou roli v tom jak se k tomu ten parser bude chovat.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod ReZetFet 14. 9. 2015 20:25

Nargon píše:Vím o tom kulový, ale možná je to "trochu" špatně. Tj jestli to tam nevrací třeba mezeru na začátku/konci, nebo co obsahuje hlavička té odpovědi. Hlavně MIME typ, co tam máš? defaultní variantu "text/html" nebo asi vhodnější "application/json" atd... tohle může hrát důležitou roli v tom jak se k tomu ten parser bude chovat.


Na tohle bych vsadil. Když jsem to zkoušel tak na začátku byl nějaký skrytý znak.
ReZetFet
Junior

Odeslat příspěvekod Wikan 14. 9. 2015 20:59

A to jsi zjistil až teď, nebo jsi to věděl už na začátku?
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod karlos00x 15. 9. 2015 07:27

ob_clean();
print json_encode($rows);
exit;
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků