Manualai.lt Forumas

HTML, CSS ir JavaScript diskusijos => jQuery => Temą pradėjo: @Jonas 2013-08-08 13:45:50 pm

Antraštė: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-08 13:45:50 pm
Sveiki, taigi ajax užklausą :

$("a#messageview").click(function(){

$.ajax({
type: "POST",
cache: false,
data: {"messageid" : $(this).data('id')},
url: "modules/getmessageinfo.php",
success: function(msg){

console.log("YES");

},
error: function(error){

console.log("NO");

}
});

});

Pats php kodas :


include("../config.php");

if(isset($_POST['messageid']))
{
$result = $connection->query("SELECT * FROM `messages` WHERE `id` = '".$_POST['messageid']."'")->fetch(PDO::FETCH_ASSOC);
$array = array();
$array['Sender'] = $result['Sender'];
$array['Receiver'] = $result['Receiver'];
$array['Subject'] = $result['Header'];
$array['Content'] = $result['Text'];
$array['Date'] = $result['Date'];

echo json_encode($array);

}


Grąžinta reikšmė :
{"Sender":"Jonas Jonaitis","Receiver":"Jonas Jonaitis","Subject":"1","Content":"132132123146545465645","Date":"2013-08-06"}

Čia viskas gerai, tik dabar man reikia jį kiekvieną atskirai išprintint, kartus pvz alert(msg); viskas gerai, bet man reikia pvz alert(msg.Sender); ir man išprintintų Jonas Jonaitis ( tokiu būdu su . operatoriumi jau bandžiau ). Dėkoju už bet kokią pagalbą.
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: vitalikaz 2013-08-08 15:49:13 pm
Prie savo ajax užklausos pridėk parametrą dataType: 'json', ir galėsi kreiptis su tašku.
$.ajax({
    // .......
    dataType: 'json',
   // ....
   success: function(msg) {
       alert(msg.Sender);
   }
});
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-08 16:32:02 pm
Kai pridedu šį parametrą man praeina success callbacką ir rodo error, šitą : console.log("NO");. Gal kažkokį headerį php ir ajax'e reikia uždėt ar kažką tokio ?
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: vitalikaz 2013-08-08 17:15:27 pm
Reiškia negali sukonvertuoti į json objektą, reiškia neteisingas json'as grąžinamas. Hm, bet iš tavo papastinto pavyzdžio tai viskas gerai atrodo. Gal išveda ne tik šitą json'ą, bet dar kažką?
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-08 17:55:55 pm
Išveda tuos duomenis kuriuos parašiau. Kiek skaičiau tai reikia headerį json kažkokį nustatyt ar kažką tokio.

Pridedu nuotrauką :
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: vitalikaz 2013-08-08 18:23:56 pm
Nebūtina. Kas ten per newline'as? :) Gali dar pabandyti be dataType'o to, bet callback'e daryt:
success: function(msg) {
  msg = $.parseJSON(msg);
}
bet čia iš esmės tas pats bus. Atsikratyk to newline'o
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-08 18:31:28 pm
Kokio new lines ? Neveikia tas būdas. O header response : text/html, o requesto : application/x-www-form-urlencoded; charset=UTF-8. Čia man atrodo kažkas ne to bus, nes grąžinimas text/html formatas.
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: vitalikaz 2013-08-08 18:35:59 pm
Na pas tave grąžinamas ne
{"Sender":"Jonas Jonaitis","Receiver":"Jonas Jonaitis","Subject":"1","Content":"132132123146545465645","Date":"2013-08-06"}o
{"Sender":"Jonas Jonaitis","Receiver":"Jonas Jonaitis","Subject":"1","Content":"132132123146545465645"
,"Date":"2013-08-06"}
Tas header'is duotų tik tą, kad nereikėtų papildoma darašynėti to dataType'o arba $.parseJSON. Ar $.parseJSON meta kokias klaidas į konsolę?
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-08 18:38:51 pm
Nežinau dėl ko tas newline, o dėl to parsejson tai vietoje success jungia error callback'ą, tai negaliu pasakyti ar meta ar ne.
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: vitalikaz 2013-08-08 18:45:16 pm
Problema ir yra tame tavo newline. Atsikratyk jo ir bus gerai :) Sakiau gi, jeigu darai su parseJSON, tada nereikia dataType'o. Be dataType sakei meta į success.
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-08 18:47:32 pm
SyntaxError: JSON.parse: unexpected character va koks erroras. Nesuprantu kaip tą new line pašalint ...
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: vitalikaz 2013-08-08 18:51:49 pm
Tai va, čia tau tą ir sako, kad blogas json'as. O blogas dėl to, kad newline'as. Matyt pačiam content'e pas tave newline'as, debugink. Žiūrėk ką konkrečiai turi masyvas prieš jį json encodinant. Nors kita vertus json_encode turėtų pasirūpinti tuo. Žodžiu, ne ten klaidos ieškai :)
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-08 18:56:19 pm
Kažkodėl po 4 įterptų elementų į array atsiranda newlines.. Niekaip nesuprantu kur problema..
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: justinas 2013-08-09 10:40:09 am
Eikit jūs, newline'ai...

JSON.parse('{"a" : "b",\n "c" : "d"}')
Object {a: "b", c: "d"}

Nerūpi JSON'ui tas whitespace. Kaip sakė, pirma atitinkamą Content-Type headerį įsidėk (application/json). PHP nėra stebuklinga lazdelė, kuri žino, ką tu ten išvedinėji – defaultina į html.

Kažkodėl po 4 įterptų elementų į array atsiranda newlines.. Niekaip nesuprantu kur problema..
Tau nėra skirtumo. Gal pas tave išvis tas, per ką žiūri atsakymą eilutes laužo. Tavo duotas JSON išsiparsina puikiai.

JSON.parse('{"Sender":"Jonas Jonaitis","Receiver":"Jonas Jonaitis","Subject":"1","Content":"132132123146545465645"\n,"Date":"2013-08-06"}')
Object {Sender: "Jonas Jonaitis", Receiver: "Jonas Jonaitis", Subject: "1", Content: "132132123146545465645", Date: "2013-08-06"}

(\n tik todėl, kad JS nepalaiko multiline stringų (kode))
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: vitalikaz 2013-08-09 12:25:48 pm
JSON.parse vienodai koks ten header'is, svarbu tekstas būtų tinkamas. Jeigu content-type'as app/json tiesiog callback'e nereikėtų papildomai parsint.
Hm, dabar pats pažiūrėjau. Jo, išparsina su newline'u paprastu, bet faktas, kad pas jį pati funkcija negali to string'o išparsinti. Gal ten koks nors kitas simbolis UTF'inis po \n eina, arba newline'as koks nors kitas. Tiesiog pas patį kažkada seniai buvo tokia pati problema, ir viskas dėl newline'o buvo, tai ir susitapatino sutuacijos. Ten kažkaip yra, kad JSON'e newline'ai turi būti pažymėti su "\\n" kai value dalyje yra, kad gerai susieitų, bet json_encode pats tuo pasirūpina. Pvz.
{"a": 123, "b": "lab
as"
, "c": "krabas"}
Tikrai neišsiparsins, nes newline'as value dalyje. Taip kad nereikia sakyti, kad vienodai jam ant tų whitespace'ų (čia aišku kas liečia value pusę - prisikabinu prie žodžių). Bet pas jį tai prieš kablelį.
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-09 13:52:57 pm
Tai visdėlto nesuprantu kur gali būti problema, nors sakot, kad json geras, bet Jsonpare funkcijoje meta errorą, kad netinkamas. Bandžiau per validatorių tikrint, tai json'as pats geras...
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-09 14:09:44 pm
Radau keistą bėda, ten kur includina config.php, kažkodėl grąžina result, bet jų neeina su jsonparse išskaidyt. O jei iš config.php perdedu connectinimą į db, į sendmessageinfo failą tai viskas veikia, tik, kad antrą kartą į db connectinasi. Dabar kyla klausimas, kodėl includintame faile config.php connectinimas neveikia normaliai sendmessageinfo, nors visur kur includini jis veikia.
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: justinas 2013-08-09 19:31:55 pm
Ten kažkaip yra, kad JSON'e newline'ai turi būti pažymėti su "\\n" kai value dalyje yra, kad gerai susieitų, bet json_encode pats tuo pasirūpina. Pvz.
{"a": 123, "b": "lab
as"
, "c": "krabas"}
Tikrai neišsiparsins, nes newline'as value dalyje. Taip kad nereikia sakyti, kad vienodai jam ant tų whitespace'ų (čia aišku kas liečia value pusę - prisikabinu prie žodžių). Bet pas jį tai prieš kablelį.
Maišai JavaScript stringus, kurie yra kode. ir tiesiog tekstą.

JavaScript stringas, užrašytas kaip
var str = 'a\nb'
reiškia
a
b

Esmė – JavaScript sintaksė nepalaiko multiline stringų. T.y.
var a = 'labas\nrytas'; // veikia
var b = 'labas
rytas'; // sintaksės klaida

JSON newline yra \n, o ne \\n
{"a" : "labas\nrytas"}
Yra validus JSON. Tai nėra JavaScript stringas.

Tą patį stringą JavaScript sintaksėje užrašyti galime taip
var str = '{"a" : "labas\\nrytas"}'

Kodėl \\n? Visų pirma, stringą parsina JavaScript interpretatorius, kuris bet kokį \n keistų į newline. Todėl escape'inam \ su dar vienu \, ir tikrasis stringo turinys po parsinimo gaunasi
{"a" : "labas\nrytas"}

Tik tada stringą jau parsins JSON. Išparsinus JSON ir atspausdinus gauto objekto reikšmę pagal "a" raktą, gautume:
labas
rytas

Nereikia maišyti JavaScript ir JSON. JSON sintaksė iš dalies paimta iš JavaScript objektų, taisyklingas JSON bus taisyklingas JavaScript, bet ne atvirkščiai. Pavyzdžiui, JSON būtinos kabutės aplink raktus
{a : "sausainis"} // teisingas JavaScript, neteisingas JSON

O šiaip, TL;DR galima rasti JSON specifikacijoje (https://www.ietf.org/rfc/rfc4627.txt), ir nereiks daryti teorijų, kas ir kaip.
Citata
Insignificant whitespace is allowed before or after any of the six structural characters.
Antraštė: Ats: [ Jquery ] Json išprintinti pagal raktą ( key )
Parašė: @Jonas 2013-08-09 19:40:21 pm
Prieš tai rašytą problemą susitvarkiau perkeldamas connectinimą į db, į sendmessageinfo failą.