Autor Zpráva
KarelVS
Profil
Ahoj všem,

pokorně prosím o pomoc se zpracováním JSONu v Javascriptu. Mám takovýhle JSON řetězec:

var = '{

{
  "items": [
    {
      "question_id": 20745762
    },
    {
      "question_id": 20737651
    },
    {
      "question_id": 20735745
    },
    {
      "question_id": 20752162
    },
    {
      "question_id": 20743901
    },
    {
      "question_id": 20746007
    },
    {
      "question_id": 20751686
    },
    {
      "question_id": 20744032
    },
    {
      "question_id": 20748848
    },
    {
      "question_id": 20749872
    },
    {
      "question_id": 20743186
    },
    {
      "question_id": 20740287
    },
    {
      "question_id": 20744387
    },
    {
      "question_id": 20744007
    },
    {
      "question_id": 20747538
    },
    {
      "question_id": 20737294
    },
    {
      "question_id": 20752781
    },
    {
      "question_id": 20743916
    },
    {
      "question_id": 20749151
    },
    {
      "question_id": 20748047
    },
    {
      "question_id": 20739574
    },
    {
      "question_id": 20738193
    },
    {
      "question_id": 20739223
    },
    {
      "question_id": 20751964
    },
    {
      "question_id": 20751870
    },
    {
      "question_id": 20745311
    },
    {
      "question_id": 20748536
    },
    {
      "question_id": 20751617
    },
    {
      "question_id": 20750749
    },
    {
      "question_id": 20752341
    }
  ]
}'

Potřebuji zjistit počet výskytů question_id. Zkoušel jsem JSON.Parse(), ale pak už nevím, co s tím, protože ty jednotlivý položky jsou zase jako objekty, jestli tomu dobře rozumím.

Nejsem v JS nijak kovaný, takže se omlouvám za svou neznalost :-) Děkuju!
pako
Profil *
Pouzi JSON.parse a vysledok si uloz do premennej, povedzme o. Potom zistis pocet vyskytov cez vlastnost pola length ako o.items.length.
KarelVS
Profil
pako ty jseš génius! :-) Já se tu s tím rozčiluju už dva dny. Co jsem přečetl článků a nic z toho.

Prozatím stokrát děkuju. Možná ještě budu mít nějakou stupidní otázku, tak bych se ještě ozval.
KarelVS
Profil
Tak už jsem tu zase.
Mám tento kód:

var languages = new Array("c%23","java","php","c++","javascript","python"); //c%23 = c#
var counts = new Array();
        
       for(i=0;i<languages.length;i++){
            $.getJSON(url, function(json) {
            
                // získanou hodnotu uložím do pole
                counts[i] = json.total;
});              
        }  
        // jak tohle může vypsat nulu?
        alert(counts.length);

To url vrátí třeba tenhle json:

{
    "total": 479
}


JSON stoprocentně vrací korektní čísla, mám to ověřeno. Poradíte mi prosím, proč se mi ale ty hodnoty neukládají do pole counts?

Děkuju.
pako
Profil *
Predpokladam, ze v case, ked zistujes dlzku pola counts, tak v nom nie su ziadne data - cyklus necaka, kym nieco nacitas zo servera.
KarelVS
Profil
Tak už jsem na to přišel, ale myslel jsem, že se zblázním :-) Problém je v tom, že u jQuery funkce $.getJSON() není možné nastavit async: false, a proto musím ve svém případě použít funkci $.ajax().
Abych řekl pravdu, moc tomu nerozumím. Pokud by to někdy někdo potřeboval, přikládám nějaké odkazy, kde lze nalézt podrobnosti. Mně to pomohlo.

http://sjuvekar.appspot.com/blog/19003
http://www.todayisearched.com/2010/02/jquery-getjson-async-false.html
http://forum.jquery.com/topic/synchronous-getjson-request
pako
Profil *
Ak blokujes prehliadac, tak nema moc zmysel pouzivat ajax.
Chamurappi
Profil
Reaguji na KarlaVS:
Pokud by to někdy někdo potřeboval
… tak mu důrazně nedoporučuji řešit to stejným způsobem, jako to řešíš ty. Synchronní AJAX je zlo poukazující na špatný návrh aplikace.
KarelVS
Profil
Aha, tak to jste mě dostali. Já to potřeboval dodat jenom jako ukázku v semestrálce. Javascriptu nerozumím a stydím se za to.
Jakým jiným způsobem je to tedy možno řešit?
1Pupik1989
Profil
Synchronni ajax je zlo jen pro ty co s ním neumí. Jsou stavy, kdy člověk nemůže bez toho načteného soubiru spustit aplikaci. Ano, jde to asynchronně, ale je tam tuna kódu navíc.

Já teď delší dobu pracuji s webgl a 2.5D v canvasu. Potřebuji načíst modely a shadery. Jak by si to Chamurappi načítal? Neber to nějak zle, není to osočování. Jsou ale fáze kdy to jinak nejde. U běžných aplikací je to samozřejmě kravina, tam to nemá moc využití.

Jen mě naštvalo tvrzení, že synchronní přenos je zlo.
_es
Profil
1Pupik1989:
Jsou stavy, kdy člověk nemůže bez toho načteného soubiru spustit aplikaci. Ano, jde to asynchronně, ale je tam tuna kódu navíc.
Čo je naviac? Keď nastane úspešné načítanie súboru, bude spustená tá „aplikácia“. Z akého dôvodu by to nemohlo byť asynchrónne?
1Pupik1989
Profil
Protože to chceš zapsat nějak inteligentně a ne že spustíš aplikaci v 20. callbacku. V synchronním případě to má krásně pod sebou. Zítra můžu zvlášť můžu napsat příklad. Třeba mi pomůžete a půjde, ale já si to nedokážu představit.

Nicméně u async je už navíc ten callback. Pak se to jen obaluje a obaluje. To jsem myslel.
_es
Profil
1Pupik1989:
V synchronním případě to má krásně pod sebou.
A kvôli tomu treba „zaseknúť“ celý prehliadač až do stiahnutia dát? Či v prípade nejakej serverovej chyby ešte na dlhšie?
Môžeš si „krásne“ pod to zadefinovať funkciu, ktorá bude zavolaná v tom „callbacku“.
1Pupik1989
Profil
Jenže si uvědom, že reálně ve webgl můžu naćítat 20 souborů do scény. Dokážeš si představit to množství callbacků? Navíc màm timeout, který mě po nastavených sekundách odpojí.

A ano, zastavím tu aplikaci, protoże nemůže stejně bez načtených modelů běžet.
_es
Profil
1Pupik1989:
To, že si si to zle navrhol, je tvoj problém, no nepresviedčaj o takom návrhu ostatných. Niekedy dá veľa práce presvedčiť niekoho na správne riešenie: Využití proměné ve funkci (+ debata o sychronním AJAXu).
juriad
Profil
1Pupik1989:
Můžeš čekat na všech 20 souborů najednou.
http://kod.djpw.cz/tcbb
1Pupik1989
Profil
Ano můžu čekat na všechny. Všech 20 souborů je formátu obj. Čili texturové souřadnice musím přepočítat na pixely. Takže načtu obrázky, kde převedu procentuální jednotky na pixely. Pak z toho souboru sestavím polygon list. To samé udělám 20x.

Tak a teď mi řekněte k čemu bude dobré čumět 3 sekundy na prázdné plátno? A jaký je rozdíl mezi čumění na prázdné plátno a prázdnou stránku? Upizorňuji, že ten canvas má defaultní pozadí. Pořád je to blbé? Nebo jste si prostě usmysleli či někde přečetli že je to špatně? Není, ale musíte si na to dávat bacha. Když si nejste jisti, tak na to radši ani nešahejte. Ale jak jsem psal, občas je to nevyhnutelné. Neříkám, že tak řeším vše. Co asynchronní má být, nechť je.
Chamurappi
Profil
Reaguji na 1Pupika1989:
Synchronni ajax je zlo jen pro ty co s ním neumí.
Co je s ním zapotřebí umět? Jaká magická znalost mi uniká?

Jsou stavy, kdy člověk nemůže bez toho načteného soubiru spustit aplikaci.
To není důvod k zakousnutí prohlížeče (ani dočasnému). Jak podle tebe vypadá špatné používání synchronních požadavků, když to není ten tvůj případ? Jakým způsobem si na svůj synchronní AJAX dáváš bacha? Mně to připadá, že nad nevýhodami svého postupu prostě jen mávneš rukou…

Jsou ale fáze kdy to jinak nejde.
Vždycky to jde. Tvá argumentace jde shrnout slovy „nechce se mi to řešit, proto to nejde“ — ukaž mi něco, co doopravdy nejde.

Jenže si uvědom, že reálně ve webgl můžu načítat 20 souborů do scény.
Čím víc požadavků, tím je pravděpodobnější, že se jeden z nich pokazí či zakucká => o důvod víc udělat to asynchronně.
Není problém za sebe poskládat nekonečno asynchronních požadavků…

Tak a teď mi řekněte k čemu bude dobré čumět 3 sekundy na prázdné plátno?
Ukaž čumějícímu, jak probíhá načítání, nebo udržuj jeho pozornost animací. Ty tři sekundy můžou být klidně i tři minuty a já bych jako uživatel rád po chvíli čekání věděl, jestli načítání líně pokračuje, nebo jestli to umřelo a nemá cenu čekat.
1Pupik1989
Profil
Tvá argunentace jde úplně stejně shrnout slovy: "Nevím proč by to mohlo jít synchronně, proto budu tvrdit opak." Já neposílám požadavek v běhu aplikace, ale před načtením. Pouze jednou. Další důvod toho synchronního "haló" je, že to má být naprosto jednoduchoučký engine a nikdo na callbacky není zvědavý. Pravda, je lepší mít třeba o 500 volání funkcí navíc a nehledět na to, že jen za tu dobu volání callbacků se ty soubory dávno vyparsují a připraví k přidání do scény. Navíc v dnešní době máme cache.

A synchronní volání umí také vracet status. :)
_es
Profil
1Pupik1989:
Pravda, je lepší mít třeba o 500 volání funkcí navíc a nehledět na to, že jen za tu dobu volání callbacků se ty soubory dávno vyparsují a připraví k přidání do scény.
To je zase čo za nezmysel? Čo by na tom malo ísť rýchlejšie? Opak je pravdou. Asynchrónnych volaní môže prehliadač vyslať a očakávať viac súčasne, pri synchrónnom len jedno. A pri čakaní na spojenie prehliadač nerobí nič, zatiaľ čo pri asynchrónnom môže niečo robiť, trebárs nejako spracovávať dáta vrátené z iného spojenia.
1Pupik1989
Profil
Je pravda, že taková načítací smyčka mě nenapadla ani náhodou. Jde hlavně o to, že si to asi neumím tak dobře rozvrhnout.

Takže na jednom řádku načtu soubor a na dalším ho uż přidávám. Nechtěl jsem, aby ty callbacky byly viditelné. No, napíšu zvlášť vlákno, třeba to opravdu půjde lépe.

edit: To předtím jsem asi nějak nedomyslel. Možná lepší příklad by byl autoloader co jsem tu řešil. Soubor se třídou není načtení. Tak ho načtu a pokračuji dál. Nemůžu pokračovat dál bez souboru, protože nastane chyba.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: