Интерфейс Externalizable фактически не предоставлялся для оптимизации производительности процесса сериализации! но для предоставления средств для реализации собственной пользовательской обработки и обеспечения полного контроля над форматом и содержимым потока для объекта и его супер-типов!
Примерами этого является реализация AMF (ActionScript Message Format) удалять для передачи собственных объектов сценария действия по сети.
как это?
serialize = function (obj) {var str = []; for (var p in obj) if (obj.hasOwnProperty (p)) {str.push (encodeURIComponent (p) + "=" + encodeURIComponent (obj [p])); } return str.join ("&"); } console.log (сериализовать ({foo: "привет там", bar: "100%"})); // foo = hi% 20there & bar = 100% 25
Изменить: этот также преобразует рекурсивные объекты (используя нотацию php «массив» для строки запроса)
serialize = function (obj, prefix) {var str = [ ], п; for (p in obj) {if (obj.hasOwnProperty (p)) {var k = prefix? префикс + "[" + p + "]": p, v = obj [p]; str.push ((v! == null && typeof v === "объект")? serialize (v, k): encodeURIComponent (k) + "=" + encodeURIComponent (v)); }} return str.join ("&"); } консоль. журнал (сериализовать ({foo: "привет там", bar: {blah: 123, quux: [1, 2, 3]}})); // foo = hi% 20there & bar% 5Bblah% 5D = 123 & bar% 5Bquux% 5D% 5B0% 5D = 1 & bar% 5Bquux% 5D% 5B1% 5D = 2 & bar% 5Bquux% 5D% 5B2% 5D = 3
Вот простой ответ, который имеет дело со строками и массивами одновременно во время преобразования.
jsonToQueryString: function (data) {
return Object.keys(data).map((key) => {
if (Array.isArray(data[key])) {
return (`${encodeURIComponent(key)}=${data[key].map((item) => encodeURIComponent(item)).join('%2C')}`);
}
return(`${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`);
}).join('&');
}
вот простая реализация, которая получает объект и преобразовывает его для запросов строки параметрических усилителей
export function objectToQueryParams(queryParams: object): string {
return queryParams ?
Object.entries(queryParams).reduce((acc, [key, val], index) => {
const sign = index === 0 ? '?' : '&';
acc += `${sign}${key}=${val}`;
return acc;
}, '')
: '';
}
использовать JSON.
взгляните на этот вопрос для идей о том, как реализовать.
Вам нужно отправлять произвольные объекты? Если это так, GET - плохая идея, поскольку существуют ограничения на длину URL-адресов, которые будут принимать пользовательские агенты и веб-серверы. Я предлагаю создать массив пар имя-значение для отправки, а затем создать строку запроса:
function QueryStringBuilder() {
var nameValues = [];
this.add = function(name, value) {
nameValues.push( {name: name, value: value} );
};
this.toQueryString = function() {
var segments = [], nameValue;
for (var i = 0, len = nameValues.length; i < len; i++) {
nameValue = nameValues[i];
segments[i] = encodeURIComponent(nameValue.name) + "=" + encodeURIComponent(nameValue.value);
}
return segments.join("&");
};
}
var qsb = new QueryStringBuilder();
qsb.add("veg", "cabbage");
qsb.add("vegCount", "5");
alert( qsb.toQueryString() );