Кажется, что ответы здесь не охватывают все типы, которые возможны в JavaScript, поэтому вот несколько коротких примеров того, как правильно их решить:
//Objects and Arrays:
var obj = {key: "value"};
localStorage.object = JSON.stringify(obj); //Will ignore private members
obj = JSON.parse(localStorage.object);
//Boolean:
var bool = false;
localStorage.bool = bool;
bool = (localStorage.bool === "true");
//Numbers:
var num = 42;
localStorage.num = num;
num = +localStorage.num; //short for "num = parseFloat(localStorage.num);"
//Dates:
var date = Date.now();
localStorage.date = date;
date = new Date(parseInt(localStorage.date));
//Regular expressions:
var regex = /^No\.[\d]*$/i; //usage example: "No.42".match(regex);
localStorage.regex = regex;
var components = localStorage.regex.match("^/(.*)/([a-z]*)$");
regex = new RegExp(components[1], components[2]);
//Functions (not recommended):
function func(){}
localStorage.func = func;
eval( localStorage.func ); //recreates the function with the name "func"
Я не рекомендую хранить функции, потому что eval()
злой может привести к проблемам безопасности, оптимизации и отладки. В общем случае eval()
никогда не следует использовать в JavaScript-коде.
Проблема с использованием JSON.stringify()
для хранения объектов заключается в том, что эта функция не может сериализовать закрытых членов , Эта проблема может быть решена путем перезаписи метода .toString()
(который неявно используется при хранении данных в веб-хранилище):
//Object with private and public members:
function MyClass(privateContent, publicContent){
var privateMember = privateContent || "defaultPrivateValue";
this.publicMember = publicContent || "defaultPublicValue";
this.toString = function(){
return '{"private": "' + privateMember + '", "public": "' + this.publicMember + '"}';
};
}
MyClass.fromString = function(serialisedString){
var properties = JSON.parse(serialisedString || "{}");
return new MyClass( properties.private, properties.public );
};
//Storing:
var obj = new MyClass("invisible", "visible");
localStorage.object = obj;
//Loading:
obj = MyClass.fromString(localStorage.object);
Другая проблема stringify
может В этом примере JSON.stringify()
выдаст TypeError
«Преобразование круговой структуры в JSON» . Если нужно сохранить циклические ссылки, может быть использован второй параметр JSON.stringify()
:
var obj = {id: 1, sub: {}};
obj.sub["circular"] = obj;
localStorage.object = JSON.stringify( obj, function( key, value) {
if( key == 'circular') {
return "$ref"+value.id+"$";
} else {
return value;
}
});
Однако найти эффективное решение для хранения циклических ссылок сильно зависит от задач, которые необходимо решить, и восстановление таких данных также не является тривиальным.
Уже существует некоторый вопрос о SO, посвященный этой проблеме: Stringify (конвертировать в JSON) объект JavaScript с круглой ссылкой
В Drive метаданные файла отделены от его содержимого. Вы запросили metadata.readonly
область действия, которая неудивительно, что позволяет только доступ к метаданным. Ваш звонок на files().get
получает метаданные.
Чтобы получить контент, сначала нужно выбрать более разрешающую область. Затем вы получите содержимое. Как это сделать, зависит от того, является ли файл двоичным файлом или документом Google (например, электронной таблицей).
Бинарный файл можно загрузить, добавив alt=media
к URL-адресу.
Файл Google можно экспортировать, добавив /export?mimeType=text/csv
к URL-адресу.
См. https://developers.google.com/drive/api/v3/manage-downloads для получения подробной информации и примеров кода.