Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
7cezar97
Člen
Avatar
7cezar97:30.9.2021 19:26

Práce s json mimo funkci fetch nebo $.getJSON

Zkusil jsem: Zkusil jsem to pomocí xmlhttpsrequest a to funguje, ale chtěl bych se zeptat, jestli není něco lepšího

Chci docílit: Chci, abych mohl dát json do proměnné a chci se zeptat jestli to je jediná možnost nebo jestli jde některá jQuery funkce použít
Pomocí JSON souboru vytvářím tlačítka a potřebuji, abych mohla jednotlivá tlačítka vytvořit další

var dotaz = new XMLHttpRequest;
    dotaz.open('GET','static/js/helpdesk.json',false)
    dotaz.send(null)
    console.log(dotaz.responseText)
    jsoon=JSON.parse(dotaz.responseText)
    dotaz=jsoon.dotaz
    console.log(jsoon.dotaz[1])
    $.getJSON("static/js/helpdesk.json", (data)=>{
        dotaz=data

        let j =0;
        $.each(dotaz.dotaz,(i, item)=>{
            if((i)%3==0 && i!=0){
                j++;
                $(".button_row").parent().append('<div class="row button_row"></div>')
            }
            console.log(item);
            $(".button_row").eq(j).append('<div class="col-lg-4"><button class="moznost btn btn-primary" type="button">'+item.nazev +'</button></div>')

        })
        /*console.log(data.dotaz)*/});
    /*dotaz= fetch("static/js/helpdesk.json")
    .then(response => {
       return response.json();

    }).then(data=>{console.log(data)});*/
 
Odpovědět
30.9.2021 19:26
Avatar
7cezar97
Člen
Avatar
7cezar97:30.9.2021 21:05

Jo našel jsem to, lze to udělat takhle:

var dotaz;
fetch("static/js/helpdesk.json")
    .then(data=>dotaz=data);
console.log(dotaz)
 
Nahoru Odpovědět
30.9.2021 21:05
Avatar
7cezar97
Člen
Avatar
7cezar97:30.9.2021 21:21

Zjistil jsm, že to nefunguje to bez předešlého kódu

 
Nahoru Odpovědět
30.9.2021 21:21
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.10.2021 8:01

JSON by mel byt js string.
Melo by to jit nacist pres request jako json. Jak to mas.
String by mel jit pak pouzit primo pres eval. Neprijemne je, ze eval dela vic nez to. kdyz to tam nekdo podstrci jiny js kod, funkci, eval ho vykona. A taky je dobre si pohlidat, zda mas spravne kodovani znaku win/utf.

x = "{123:456}";
x = eval(x);
alert(x[123]); // alert(x['123'])

google = js decode json string
https://developer.mozilla.org/…s/JSON/parse
https://learncodeweb.com/…-javascript/
https://stackoverflow.com/…to-an-object
https://www.freecodecamp.org/…-javascript/

  <script>
fetch('https://api.chucknorris.io/jokes/random?category=dev')
  .then(res => res.json()) // the .json() method parses the JSON response into a JS object literal
  .then(data => console.log(data));

    fetch("./jokes.json", { mode: "no-cors" }) // disable CORS because path does not contain http(s)
      .then((res) => res.json())
      .then((data) => console.log(data));

const fs = require('fs');
const jokesFile = fs.readFileSync('./jokes.json', 'utf8');
const jokes = JSON.parse(jokesFile);

  </script>
 
Nahoru Odpovědět
1.10.2021 8:01
Avatar
7cezar97
Člen
Avatar
7cezar97:1.10.2021 23:31
var dotaz = new XMLHttpRequest;
    dotaz.open('GET','static/js/helpdesk.json',false)
    dotaz.send(null)
    jsoon=JSON.parse(dotaz.responseText)
    dotaz=jsoon.dotaz

dotaz je json uložený do var, ale chtěl bych se zeptat jestli by nešlo něco co využívá jquery či čistý javascript a není to tak zastaralé jako XMLHttpRequest a uložit do proměné s kterou bych následně mohl pracovat nezávisle a vně nějaké funkce

 
Nahoru Odpovědět
1.10.2021 23:31
Avatar
Odpovídá na 7cezar97
Ondřej Šrytr:2.10.2021 22:36

Používat jQuery kvůli použití JSON je naprosto zbytečné. Řešení využívající metodu fetch v odpovědi Petera je pomocí čistého Javascriptu. Fetch je nová obdoba a alternativa XMLHttpRequest.

 
Nahoru Odpovědět
2.10.2021 22:36
Avatar
7cezar97
Člen
Avatar
Odpovídá na Ondřej Šrytr
7cezar97:3.10.2021 12:46

Já vím, že modernější je fetch oproti XMLHttpRequest, ale chtěl bych dostat ten json ven jako proměnou a to se mi s fetch nedaří

 
Nahoru Odpovědět
3.10.2021 12:46
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.10.2021 14:51

Neni mi jasne, co chces udelat. Vytvor jednoduchy program s nejakym demo jsonem a nekde to vystav. jsfiffle.net nebo u sebe. Co ti pise js konzola za chybu?

Do jineho okna muzes predat js promenou. Pokud tam neni omezeni CORS.
Do jineho souboru muzes predat jen string, treba ten jsonovy.
Do html stranky lze nacist json jako js kod. (jakoze, nemusis to tahat requestem, pokud se ta data nemeni)

<script>
var x = "<?php echo json_endode(array(1,2,3)) ?>";
</script>

<div>
<?php echo json_endode(array(1,2,3)) ?>
</div>

<div>
<?php echo htmlspecialchars(file_get_content('http://seznam.cz')) ?>
</div>
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
3.10.2021 14:51
Avatar
Odpovídá na 7cezar97
Ondřej Šrytr:3.10.2021 17:28

Aha, teď koukám na ten tvůj kód. Problém je, že fetch se vždy volá asynchronně, XMLHttpRequest nastavuješ, aby byl synchronní (3. parametr metody open).

Asynchronní volání funguje tak, že se kód vykoná, ale nečeká na jeho dokončení. Takže se jde rovnou dál, v tvém případě na výpis řetězce do konzole. V tu dobu ještě nebyl asynchronní kód dokončen, tak proměnná zůstává prázdná. Řešení je využít nějaký callback.

Asynchronní XMLHttpRequest https://www.w3schools.com/js/tryit.asp?…
Příklad fetch:

fetch('http://example.com/movies.json')
  .then((response) => {
    return response.json();
  })
  .then((myJson) => {
    console.log(myJson);
  });
 
Nahoru Odpovědět
3.10.2021 17:28
Avatar
7cezar97
Člen
Avatar
Odpovídá na Ondřej Šrytr
7cezar97:6.10.2021 22:45

Děkuji, za odpověď a pro mé účely budu asi muset ty data dát do databáze. Vůbec jsem nevěděl, že asynchronní funkce existují děkuji za vysvětlení

 
Nahoru Odpovědět
6.10.2021 22:45
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.10.2021 13:30

Pouziva se to pro stahovani obrazku, treba. Dobre je videt na pomalem internetu, jak se postupne nacitaji obrazky.

 
Nahoru Odpovědět
7.10.2021 13:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.