Knockout.js — это библиотека JavaScript, обеспечивающая реактивное связывание данных между моделью и представлением. Одной из ключевых возможностей фреймворка является работа с JSON, что особенно важно при взаимодействии с сервером и сериализации данных.
JSON (JavaScript Object Notation) представляет собой текстовый формат для обмена данными, удобный для передачи объектов между клиентом и сервером. В контексте Knockout.js JSON используется для сериализации моделей и их последующей передачи через AJAX-запросы.
Пример обычного JavaScript-объекта и его преобразования в JSON:
var person = {
name: "Иван",
age: 30
};
var jsonString = JSON.stringify(person);
console.log(jsonString); // {"name":"Иван","age":30}
В Knockout.js прямое использование JSON.stringify часто
не подходит, если объект содержит обсерваблы
(ko.observable), так как сериализация вернёт
структуру с функциями, а не значения.
ko.toJS и
ko.toJSONДля корректной работы с обсерваблами предоставляются утилиты:
ko.toJS(object) — преобразует объект
Knockout в обычный JavaScript-объект, автоматически раскрывая все
обсерваблы.ko.toJSON(object) — аналогично
ko.toJS, но сразу возвращает строку JSON.Пример использования:
var viewModel = {
name: ko.observable("Иван"),
age: ko.observable(30)
};
// Преобразование в обычный объект
var plainObject = ko.toJS(viewModel);
console.log(plainObject); // { name: "Иван", age: 30 }
// Преобразование в JSON
var jsonString = ko.toJSON(viewModel);
console.log(jsonString); // {"name":"Иван","age":30}
Таким образом, ko.toJSON обеспечивает правильную
сериализацию даже при наличии вложенных обсерваблов и массивов.
Knockout.js позволяет создавать сложные модели с вложенными объектами
и массивами. При сериализации важно учитывать, что ko.toJS
и ko.toJSON рекурсивно обрабатывают все вложенные
обсерваблы.
Пример сложной модели:
var viewModel = {
name: ko.observable("Мария"),
age: ko.observable(25),
contacts: ko.observableArray([
{ type: ko.observable("email"), value: ko.observable("maria@example.com") },
{ type: ko.observable("phone"), value: ko.observable("+79991234567") }
])
};
var jsonString = ko.toJSON(viewModel);
console.log(jsonString);
/*
{
"name":"Мария",
"age":25,
"contacts":[
{"type":"email","value":"maria@example.com"},
{"type":"phone","value":"+79991234567"}
]
}
*/
Вложенные массивы и объекты автоматически раскрываются в значения, пригодные для передачи на сервер.
Иногда необходимо исключить определённые поля из сериализации.
Knockout.js поддерживает флаг _koMapping
или пользовательскую функцию фильтрации через
ko.toJSON(object, replacer), аналогично второму аргументу
JSON.stringify.
Пример:
var viewModel = {
name: ko.observable("Алексей"),
password: ko.observable("секрет"),
age: ko.observable(40)
};
var jsonString = ko.toJSON(viewModel, function(key, value) {
if (key === "password") return undefined;
return value;
});
console.log(jsonString); // {"name":"Алексей","age":40}
Функция replacer позволяет гибко управлять сериализацией
и исключать конфиденциальные данные или временные поля.
ko.toJSON корректно обрабатывает массивы
обсерваблов:
var viewModel = {
items: ko.observableArray([ko.observable("Элемент 1"), ko.observable("Элемент 2")])
};
console.log(ko.toJSON(viewModel)); // {"items":["Элемент 1","Элемент 2"]}
При этом вложенные обсерваблы внутри массива также автоматически раскрываются.
$.ajax({
url: "/api/save",
type: "POST",
contentType: "application/json",
data: ko.toJSON(viewModel),
success: function(response) {
console.log("Данные успешно отправлены");
}
});
localStorage:localStorage.setItem("userData", ko.toJSON(viewModel));
var storedData = JSON.parse(localStorage.getItem("userData"));
console.log(storedData);
ko.toJSON вместо JSON.stringify.ko.toJS.replacer,
чтобы избежать передачи лишней или конфиденциальной информации.ko.toJSON и ko.toJS являются мощными
инструментами, упрощающими работу с данными в Knockout.js и
обеспечивающими безопасное взаимодействие с сервером и локальным
хранилищем.