2014-02-04 2 views
0

Я использую FileReader API:javascript | JSON синтаксического анализа

if (window.File && window.FileReader && window.FileList && window.Blob) { 

} else { 

    alert('The File APIs are not fully supported in this browser.'); 
    return; 
} 

input = document.id('fileinput'); 

if (!input) { 
    alert("Um, couldn't find the fileinput element."); 
} else if (!input.files) { 
    alert("This browser doesn't seem to support the `files` property of file inputs."); 
} else if (!input.files[0]) { 
    alert("Please select a file before clicking 'Load'");    
} else { 
    file = input.files[0]; 
    fr  = new FileReader();  
    fr.onload = function() { 
     console.log(JSON.parse(fr.result)); 
    } 

    fr.readAsText(file); 
} 

Я получаю это в моей консоли:

{"id":"2","name":"Links1","position":"1","author":"Demo","email":"[email protected]","description":"","html":"<div class=\"units-row-end\" id=\"links\"><\/div>","css":"","js":"var out = '<a href=\"#!index\" class=\"home\">Home<\/a> ';\nout += user.type ? '<a href=\"#!logout\">Logout<\/a> ' : '<a href=\"#!login\">Login<\/a> ';\nout += user.type ==2 ? '<a href=\"#!admin?template=overview\">Account<\/a> ' : user.type == 1 ? '<a href=\"#!user?template=overview\">Account<\/a> ' : '';\nout += user.type !=2 ? '<a href=\"#!cart\">Cart<\/a>' : '';\n\ndocument.id('links').set('html', out);","status":"1"} 

Этот выход не является объектом в моей консоли! Зачем? Если я пытаюсь скопировать строку выше и прошёл в: http://json.parser.online.fr/, эта строка преобразуется в объект. Где проблема?

PS Моего содержимое файла (fr.result):

"{\"id\":\"2\",\"name\":\"Links1\",\"position\":\"1\",\"author\":\"Demo\",\"email\":\"[email protected]\",\"description\":\"\",\"html\":\"<div class=\\\"units-row-end\\\" id=\\\"links\\\"><\\\/div>\",\"css\":\"\",\"js\":\"var out = '<a href=\\\"#!index\\\" class=\\\"home\\\">Home<\\\/a> ';\\nout += user.type ? '<a href=\\\"#!logout\\\">Logout<\\\/a> ' : '<a href=\\\"#!login\\\">Login<\\\/a> ';\\nout += user.type ==2 ? '<a href=\\\"#!admin?template=overview\\\">Account<\\\/a> ' : user.type == 1 ? '<a href=\\\"#!useraccount?template=overview\\\">Account<\\\/a> ' : '';\\nout += user.type !=2 ? '<a href=\\\"#!cart\\\">Cart<\\\/a>' : '';\\n\\ndocument.id('links').set('html', out);\",\"status\":\"1\"}" 
+1

'JSON.parse (fr.result)' это объект. Проверьте это: 'console.log (typeof JSON.parse (fr.result))' – karaxuna

+0

Консоль показать мне: строка – user889349

+0

Нам нужно знать, что такое 'fr.результат' выглядит так, и о какой консоли мы говорим (Firefox? Firebug? Chrome? Internet Explorer?). Остальная часть кода о API FileReader не кажется релевантной. –

ответ

1

Если фактическое содержимое файла (как показано при открытии файла с помощью текстового редактора, а не демпинг fr.result с консолью Firefox) является именно это:

"{\"id\":\"2\",\"name\":\"Links1\",\"position\":\"1\",\"author\":\"Demo\",\"email\":\"[email protected]\",\"description\":\"\",\"html\":\"<div class=\\\"units-row-end\\\" id=\\\"links\\\"><\\\/div>\",\"css\":\"\",\"js\":\"var out = '<a href=\\\"#!index\\\" class=\\\"home\\\">Home<\\\/a> ';\\nout += user.type ? '<a href=\\\"#!logout\\\">Logout<\\\/a> ' : '<a href=\\\"#!login\\\">Login<\\\/a> ';\\nout += user.type ==2 ? '<a href=\\\"#!admin?template=overview\\\">Account<\\\/a> ' : user.type == 1 ? '<a href=\\\"#!useraccount?template=overview\\\">Account<\\\/a> ' : '';\\nout += user.type !=2 ? '<a href=\\\"#!cart\\\">Cart<\\\/a>' : '';\\n\\ndocument.id('links').set('html', out);\",\"status\":\"1\"}" 

.. , что объясняет проблему.

Прежде всего, вы действительно не имеете действительного JSON, как показывает любой JSON validator. В формате данных JSON элемент верхнего уровня должен быть объектом или массивом, а ваш - строкой. Однако метод JSON.parse(), по-видимому, допускает эти случаи подэлементов JSON (вероятно, потому, что возможность их декодирования является полезной и простой в реализации функцией).

Но поскольку у вас есть только одна строка, это то, что вы получаете после ее декодирования: строка. Что касается JSON касается, ваш формат данных не отличается от этого:

"Hello, World!" 

Я подозреваю, что проблема в коде, который используется для генерации этот файл в формате JSON. Похоже, это , кодирующий вывод дважды. Это, вероятно, следует выглядеть следующим образом:

{"id":"2","name":"Links1","position":"1","author":"Demo","email":"[email protected]","description":"","html":"<div class=\"units-row-end\" id=\"links\"><\/div>","css":"","js":"var out = '<a href=\"#!index\" class=\"home\">Home<\/a> ';\nout += user.type ? '<a href=\"#!logout\">Logout<\/a> ' : '<a href=\"#!login\">Login<\/a> ';\nout += user.type ==2 ? '<a href=\"#!admin?template=overview\">Account<\/a> ' : user.type == 1 ? '<a href=\"#!useraccount?template=overview\">Account<\/a> ' : '';\nout += user.type !=2 ? '<a href=\"#!cart\">Cart<\/a>' : '';\n\ndocument.id('links').set('html', out);","status":"1"} 

Пожалуйста, обратите внимание, что ведущие и завершающие кавычки ушли (вместе со всеми обратными косыми чертами экранирующих последовательностей внутри). Таким образом, у вас есть закодированный объект, и вы получите декодированный объект.

0

Есть два способа:

  1. переписывать вам файл (как очевидный JS файл): { "идентификатор ":" 2 "," name ":" Links1 "," position ":" 1 ", ...

  2. Если вы не можете изменить свой файл, используйте этот прием:

    fr.onload = function() {

    eval ('var temp =' + fr.result + ';');

    console.log (JSON.parse (temp));

    }

+0

Пожалуйста, проверьте его после P.S – user889349

+0

В файле уже содержится одна длинная строка. –

+0

Да. И что? Как я могу преобразовать это в объект? – user889349

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