Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вывод JSON Объекта из localStorage (https://javascript.ru/forum/misc/29503-vyvod-json-obekta-iz-localstorage.html)

Философ 30.06.2012 18:10

Вывод JSON Объекта из localStorage
 
Вобщем надо вывести все объекты из локалстоража...Если применяю $.parseJSON(); к переменной value - выдает undefined, если нет, то выводит тупо весь JSON объект из значения строкой. Что не так?
// JavaScript Document
$(document).ready(function(){
		function isLocalStorageAvailable(){
				try {
					return 'localStorage' in window && window['localStorage'] !== null;
				} catch (e) {
					return false;
				}
			}
		try {
			//localStorage.setItem('foo', 'bar');
		} catch (e) {
			if (e == QUOTA_EXCEEDED_ERR) {
				alert('Локальное хранилище переполнено');
			}
		}
	$.getJSON(
		'json/posts.json',
		function(data){
		var posts = '';
	  	$.each(data, function(postIndex, post) {
			localStorage.setItem('post_id'+post['id'], JSON.stringify(post));
			posts += localStorage['post_id'+post['id']];
			
			//var local = $.parseJSON(posts);
			//alert(local);
		})
		var ololo = $.parseJSON(localStorage['post_id1']);
		alert(ololo.title);
		var obj = window.localStorage;
		for(var key in obj){
			value = localStorage[key];
			alert(key +'=>'+value);
		  alert('Ошибка где-то до этой строки.');
		};
		  for (var i = 0; i < localStorage.length; i++) {
		       alert(localStorage[i] + " = " + $.parseJSON(localStorage[localStorage[i]]));
			   $.each($.parseJSON(localStorage[localStorage[i]]), function(eIndex, e) {
				   alert(e.title);	
			   });
		  }
		//for(var i=1, len=localStorage.length; i<len; i++) {
		//    var value = $.parseJSON(localStorage['post_id'+i]);
		//		$.each(value, function(eIndex, e) {								
		//			alert(e.title);
		//			});
		//}
		//var local = $.parseJSON(posts);
		alert(posts);
		//posts += localStorage.setItem('posts', JSON.stringify(data))
		//var local = $.parseJSON(localStorage.getItem('posts'));
		//formatposts = $.parseJSON(posts);
		//alert(formatposts);
		//for(i=0; i<posts.length; i++){
		//	alert(posts[i]);
		//}
			$.each(posts, function(entryIndex, entry) {
					var post = '<article><header><h3>';
					post += entry['title']+'</h3></header><section><p>';
					post += entry['body']+'</p></section><footer>';
					if(entry['tags']){
						post += '<div id="tags">';
						$.each(entry['tags'], function(tagIndex, tag){
							post += '<span class="label">' + tag + '</span>'
						});
						post += '</div><div class="controls"><a class="btn btn-danger btn-mini">удалить</a></div>';
					}
					post += '</footer></article>';
					$('#posts').append(post);
       		 });
		});
		
});


Вот можете посмотреть сами http://smirnoff.ho.ua/JSUI/

melky 30.06.2012 18:15

JSON !== объект.

Вы формат соблюли?

Философ 30.06.2012 20:41

разве? Хм...подскажите тогда в чем ошибка, как мне исправить код?

melky 30.06.2012 22:47

попробуйте превращать строку в объект
JSON.parse(..)
// или так 
eval("("+ .... +")");

Философ 30.06.2012 23:17

Так я же так и превращаю через $.parseJSON(), и мне выдает [Object object] вместо значений ключа, в перемечшку с кучей undefined и в самом конце один раз таки выводит заголовки

melky 30.06.2012 23:31

объекты вложенные? т.е. есть такое, что значением является объект?если да, то это плохо

Философ 30.06.2012 23:36

Эм..ну собственно каждое значение JSON объект, причем в каждом есть значение, являющееся массивом. Т.к. хранилище заполняется из JSON файла. Вот код JSON файла собственно, дабы лучше понять картину:
[
    {
        "id": 1,
        "title": "Стремящийся наибольший",
        "body": "Поле направлений нейтрализует коллинеарный полином, откуда следует доказываемое равенство.",
        "tags": [
            "тег", "еще тег"
        ]
    },
    {
        "id": 2,
        "title": "Эффузивный топаз",
        "body": "Поскольку плиты перестали сближаться, гейзер сдвигает кимберлит, в соответствии с изменениями в суммарной минерализации.",
        "tags": [
            "коренной цоколь", "дифференциация", "апатит"
        ]
    },
    {
        "id": 3,
        "title": "Звукорядный октавер",
        "body": "Ретро монотонно диссонирует форшлаг, и здесь в качестве модуса конструктивных элементов используется ряд каких-либо единых длительностей.",
        "tags": [
            "конструктивный соноропериод", "движение"
        ]
    },
    {
        "id": 4,
        "title": "Спиральный фотон",
        "body": "Любое возмущение затухает, если взрыв ненаблюдаемо искажает экранированный электрон, и это неудивительно, если вспомнить.",
        "tags": [
            "сверхновая", "гидродинамический удар"
        ]
    }
]


А почему плохо? И да, если что в верху страницы собственно видно требование задания.

В хранилище я сделал запись каждого поста, т.е. каждого объекта, и выглядит следующим образом:
post_id1 => {"id":1,"title":"Стремящийся наибольший","body":"Поле направлений нейтрализует коллинеарный полином, откуда следует доказываемое равенство.","tags":["тег","еще тег"]}

Философ 30.06.2012 23:55

Здесь да, это я специально тестил и выводил отдельный пост

Философ 01.07.2012 00:00

Хм...у Вас в конце перебирается переменная data в которой JSON массив, а надо же перебирать локалстораж, ведь посты будут добавлятся, удалятся и соответственно выводить надо работая ТОЛЬКО с локалсторажем. Заполнили в первый раз значениями базовыми из JSON файла, и все далее только с локалсторажем работаем

melky 01.07.2012 00:06

ошибки вот здесь :

for (var i = 0; i < localStorage.length; i++) {
		       alert(localStorage[i] + " = " + $.parseJSON(localStorage[localStorage[i]]));
			   $.each($.parseJSON(localStorage[localStorage[i]]), function(eIndex, e) {
				   alert(e.title);	
			   });
		  }


ибо i - число, и localStorage[ число ] не существует, ибо сохраняли с ключом вида 'post_id'+post['id']

и итерация начинается с нуля, а ID'шники погут случайным образом попадаться, т.е. простой итерацией тут не спастись.

но, ели хотите, можно так: i + 1.

идем далее.

$.parseJSON(localStorage[localStorage[i]]

это что такое? допустим i исправили, localStorage["post_id"+(i+1)] возвратит строку объекта. далее получаем undefined из внешнего (первого слева) localStorage, и пытаемся из этого undefined взять JSON. ошибочка.

вот так пойдёт
$.parseJSON(localStorage["post_id" + (i + 1)])


Часовой пояс GMT +3, время: 16:26.