2015-11-13 2 views
0

Я хочу, чтобы послать JavaScript Object как этот запрос через $ .ajax:

var o = { 
    a: 1, 
    b: 'dummy string', 
    c: ['a', 1, {}], 
    d: {dd: 1}, 
    e: new Date(), 
    f: function() { 
     console.log('here'); 
    } 
} 

Я знаю, что я обычно должен использовать JSON.stringify перед отправкой его на мой PHP скрипт. Проблема заключается в том JSON.stringify, удаляет свойства не может stringify:

JSON.stringify(o); 

returns this -> 

"{ 
    "a":1, 
    "b":"dummy string", 
    "c":["a",1,{}], 
    "d":{"dd":1}, 
    "e":"2015-11-13T21:34:36.667Z" 
}" 

Но что Шоуд я делать, если я хочу, чтобы хранить в колонке тузда «о» JavaScript объект как обычный текст как это:

o = { 
    a: 1, 
    b: 'dummy string', 
    c: ['a', 1, {}], 
    d: {dd: 1}, 
    e: new Date(), 
    f: function() { 
     console.log('here'); 
    } 
} 
+0

Зачем его нужно отправить? –

+0

Что такое PHP-скрипт, который будет работать с функцией Javascript? – Barmar

+0

Возможно, вы можете использовать аргумент функции 'replacer' функции [' JSON.stringify() '] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/ stringify), чтобы закодировать параметры, которые он изначально выйдет из строя, если по какой-то причине вам действительно необходимо их сохранить. – War10ck

ответ

3

Вы можете попробовать это:

var o = { 
    a: 1, 
    b: 'dummy string', 
    c: ['a', 1, {}], 
    d: {dd: 1}, 
    e: new Date(), 
    f: function() { 
     console.log('here'); 
    } 
}; 

o.f = o.f.toString(); 
var stringy = JSON.stringify(o); 
document.getElementById('test2').innerHTML = stringy; 

Fiddle: http://jsfiddle.net/e2cxandt/

Очевидно, это нужно немного изменить, чтобы вы не перезаписывали функцию, возможно, клонировав объект, но в качестве быстрого примера вы можете увидеть, что теперь оно имеет свойство в строке.

Как кто-то упоминались в предыдущих комментариях, war10ck, вот пример использования заменителя аргумента JSON.stringify

var o = { 
    a: 1, 
    b: 'dummy string', 
    c: ['a', 1, {}], 
    d: {dd: 1}, 
    e: new Date(), 
    f: function() { 
     console.log('here'); 
    } 
}; 

function replacer (key, value) { 
    if (typeof value === "function") { 
    return value.toString(); 
    } 
    return value; 
} 

var stringy2 = JSON.stringify(o, replacer); 
document.getElementById('test2').innerHTML = stringy2; 

Fiddle: http://jsfiddle.net/e2cxandt/1/

+0

Спасибо, на самом деле я работал с плагином JSONfn (https://github.com/vkiryukhin/jsonfn), и он выполняет эту работу, но я хотел знать, есть ли другое решение. – wawawoom

+0

Прохладный, без проблем! Могут быть другие способы, это только один из способов. – AtheistP3ace

+0

В целом, как вы думаете, можно отправить объект БЕЗ его подстроки? – wawawoom

1

пар универсальная (неспецифическая инстанция) варианты:

можно определить custon toJSON на любом объекте:

Function.prototype.toJSON=function(){return String(this);}; 

JSON.stringify({a:1, b:function(){alert(123)}}); 

, который показывает:

{"a":1,"b":"function(){alert(123)}"} 

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

лучший вариант: с помощью замены ARG на JSON.stringify():

JSON.stringify({a:1, b:function(){alert(123)}}, function(k,v){ 
    if(typeof v==="function") return String(v); 
    return v; 
}); 

, который показывает:

{"a":1,"b":"function(){alert(123)}"} 

что способ особенно хорош, потому что вам не нужно изменять встроенные или объекты экземпляра ,

+0

Изменение прототипов встроенных типов - это, как правило, плохая идея. – Barmar

+0

Я согласен на 100%, это простая демонстрация. вы можете определить '.toJSON()' как собственное свойство в экземпляре функции или сделать какое-то причудливое подклассу ES15 или просто превратить его в строку объекта перед строкой. – dandavis

+0

Да, это тоже интересно, спасибо! – wawawoom

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