2013-03-20 6 views
1

Я пытаюсь получить данные из объекта JSON, который я передал из сервлета. Но мои ключи пронумерованы. Мне нужно добавить эти числа к имени, которое я дал клавишам.Как получить данные из json

Мой ответ выглядит следующим образом ..

{"shareInfo1":[{"uname":"xyz","image":"iVBO..","imname":"ryty","senderPicture":"iVBOR"}],"shareInfo2":[{"uname":"sds","image":"iVBO","imname":"ryty","senderPicture":"iVBOR}],....} 

Я попытался с помощью следующего кода:

$.ajax({ 
    type: "GET", 
    url: "RetrieveShares", 
    data:'action='+encodeURIComponent(action), 
    dataType: "json", 
    success: function(data, textStatus, jqXHR) 
    { 
    if(data.success) 
    { 

for(var z=1;z<=data.loops;z++) 
{ 
len=data["shareInfo"+z].length; 
for(var k = len-1;k>=0;k -= 1){ 
    var newcommhtml = '<div id="S0'+thecid+'" class="snew">'; 
    newcommhtml = newcommhtml + '<div class="author-image"><img src="data:image/jpeg;base64,'+data["shareInfo"+z][k].senderPicture+'" alt="'+data["shareInfo"+z][k].uname+'" width="100%" height="100%" class="ava"></div><span>'+data["shareInfo"+z][k].uname+' shared the image '+data["shareInfo"+z][k].imname+'</span>'; 
    newcommhtml = newcommhtml + '<div class="s-content"><div class="s-message"><span>'+nl2br(data["shareInfo"+z][k].message+'</span></div><div class="shpicture">'); 
    newcommhtml = newcommhtml + '<img src="data:image/jpeg;base64,'+data["shareInfo"+z][k].image+'" alt="'+data["shareInfo"+z][k].imname+'" width="100%" height="100%" class="SharedImage" class="SharedImage" data-id="'+data["shareInfo"+z][k].id+'" data-alid="'+data["shareInfo"+z][k].alid+'" data-shareid="'+data["shareInfo"+z][k].shareId+'">'; 
    newcommhtml = newcommhtml + '</div></div>'; 
    var thelm = "#S0"+thecid; 
    $('#spscrl').append(newcommhtml); 
    $(thelm).hide().fadeIn('slow'); 
    newcommhtml ='<div class="SPcommentbox">'; 
    var i=0; 
    if(Object.keys(data["shareInfo"+z][k]).length>8) 
    { 
     var x; 
     for(x=data["shareInfo"+z][k].loopreq-1;x>=0;x-=1) 
      { 
     newcommhtml = newcommhtml + '<div class="comment"><div class="commenter-image"><img src="data:image/jpeg;base64,'+data["shareInfo"+z][k]["commenterPicture"+i]+'" alt="'+data["shareInfo"+z][k]["whocommented"+i]+'" width="100%" height="100%" class="ava"></div><div class="commentername">'+data["shareInfo"+z][k]["whocommented"+i]+'</div><span>'+data["shareInfo"+z][k]["commented"+i]+'</span></div>'; 
     i+=1; 
      } 
    } 
    newcommhtml = newcommhtml + '<div class="comment"><div class="commenter-image">'; 
    newcommhtml = newcommhtml +'</div><div class="addcomment"><input type ="text" placeholder="Write a comment..." class="commentbox"></input></div></div>'; 
    $('#spscrl').append(newcommhtml); 
    thecid++; 
    } 
    $(".primg > img").first().clone().appendTo(".commenter-image"); 
    } 
    } 
}, 
    error: function(jqXHR, textStatus, errorThrown) 
    { 
    alert("error"+errorThrown); 
    console.log("Something really bad happened " + textStatus); 
    }, 
    }); 

Но он производит ошибку TypeError: data[("shareInfo" + z)] is undefined

Пожалуйста, кто-нибудь помочь мне решить эту проблему. .. Спасибо ...

+0

Попробуйте это .. [ "shareInfo1": [{...}], "shareInfo2": [{...}], ....] –

+3

Попробуйте разместить немного больше кода, пожалуйста, , – SteveP

+0

Полный ключ с z var не существует. напишите больше из своего кода, используя jsfiddler или что-то. – Adidi

ответ

-1

Перед тем, как приступить к модификации элементов DOM, создайте меньшую и упрощенную структуру.

Адрес example с помощью функции jQuerys $.each();

var data = { 
    loops: { 
     "shareInfo1": [ 
      { 
       "uname": "xyz", 
       "image": "iVBO..", 
       "imname": "ryty", 
       "senderPicture": "iVBOR" 
      }, 
      { 
       "uname": "abc", 
       "image": "iVBO..", 
       "imname": "smile", 
       "senderPicture": "iVBOR" 
      } 
     ], 
     "shareInfo2": [ 
      { 
       "uname": "sds", 
       "image": "iVBO", 
       "imname": "happy", 
       "senderPicture": "iVBOR" 
      } 
     ] 
    } 
}; 

console.log('data', data); // DEBUG 

// Iterating the data 
$.each(data.loops, function(key, shareInfo) { 
    console.log('shareInfo', key, shareInfo); // DEBUG 

    $.each(shareInfo, function(key, user) { 
     console.log('user', key, user); // DEBUG 

     // Username: user.uname 
    }); 

}); 
+0

Спасибо, за предоставленную идею. Вы предоставили метод для «ответов данных» для меня .... – 2013-03-20 13:31:57

-1

Ваш сервлет отправляет ваши js на объект как String не как Object. Таким образом, вы должны сначала преобразовать его в JSON объект как

data = eval('(' + response + ')'); 
data["shareInfo"+z].length; 
+0

Никогда не используйте 'eval' для анализа JSON. – Quentin

+0

Я не думаю, что это проблема, поскольку он имеет в виду data.loops. Преобразование строки в JSON должно выполняться с использованием JSON.parse. – SteveP

+0

Попробуйте использовать [JSON.parse] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/parse) или [jQuery.parseJSON] (http: //api.jquery .com/jQuery.parseJSON /), а не [eval] (http://stackoverflow.com/questions/1843343/json-parse-vs-eval). – Stefan

0

Я знаю, это не direcly ответить на ваш вопрос, но он может обеспечить способ сортировки его.

Если вы в состоянии изменить задний конец, я бы предложил изменить формат ваших возвращаемых данных для использования массивов:

{ 
    "shareInfo":[ 
    {...}, 
    {...}, 
    {...} 
    ] 
} 

Тогда вы можете просто использовать обычный shareInfo [индекс], и shareInfo.length и т. д.

+0

Я знаю, что это сработает. Но в моем ответе мне нужно разместить больше массивов с общим именем в них. Я отредактировал ответ в своем вопросе. Я не могу опубликовать все ответы «Ответ» ... – 2013-03-20 09:37:14

Смежные вопросы