Сериализация в JSON в jQuery [дубликат]

этот вопрос уже есть ответ здесь:

мне нужно сериализовать объект в JSON. Я использую jQuery. Есть ли "стандартный" способ сделать это?

моя конкретная ситуация: у меня есть массив, как показано ниже:

var countries = new Array();
countries[0] = 'ga';
countries[1] = 'cd';
...

и мне нужно это в строку, чтобы перейти к $.ajax() такой:

$.ajax({
    type: "POST",
    url: "Concessions.aspx/GetConcessions",
    data: "{'countries':['ga','cd']}",
...

11 ответов


JSON-js - JSON в JavaScript.

преобразовать объект в строку, используйте JSON.stringify:

var json_text = JSON.stringify(your_object, null, 2);

преобразовать строку JSON в объект, используйте JSON.parse:

var your_object = JSON.parse(json_text);

это было недавно рекомендовано Джон В Отставку:

...Пожалуйста, начните миграцию ваш JSON-использование приложений для Json2 Крокфорд это.js. Это полностью совместимость с ECMAScript 5 спецификация и грациозно ухудшает если родной (быстрее!) реализация существует.

на самом деле, я только что приземлился изменение в jQuery вчера, который использует формат JSON.метод parse, если он существует, теперь что это было полностью определено.

Я склонен доверять тому, что он говорит о JavaScript :)

новые браузеры поддержка объект JSON нативно. Текущая версия библиотеки JSON Крокфорда будет определять только JSON.stringify и JSON.parse если они не уже определено, оставляя любую собственную реализацию браузера нетронутой.


Я использую в jQuery-JSON-формате в течение 6 месяцев и он прекрасно работает. Он очень прост в использовании:

var myObj = {foo: "bar", "baz": "wockaflockafliz"};
$.toJSON(myObj);

// Result: {"foo":"bar","baz":"wockaflockafliz"}

работает на IE8+

нет необходимости в jQuery, используйте:

JSON.stringify(countries); 

Я не использовал его, но вы можете попробовать плагин jQuery, написанный Марком Гибсоном

Он добавляет две функции: $.toJSON(value), $.parseJSON(json_str, [safe]).


нет, стандартный способ сериализации в JSON-использовать существующую библиотеку сериализации JSON. Если вы не хотите этого делать, вам придется написать свои собственные методы сериализации.

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

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


Я нашел это где-то. Хотя не могу вспомнить где... наверное, на StackOverflow :)

$.fn.serializeObject = function(){
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name]) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

Если вы не хотите использовать внешние библиотеки есть .toSource() собственный метод JavaScript, но это не кросс-браузер.


лучший способ-включить polyfill для JSON


Да, вы должны JSON.stringify и JSON.проанализируйте "Json_PostData" перед вызовом $.ajax

   $.ajax({
            url:    post_http_site,  
            type: "POST",         
            data:   JSON.parse(JSON.stringify(Json_PostData)),       
            cache: false,
            error: function (xhr, ajaxOptions, thrownError) {
                alert(" write json item, Ajax error! " + xhr.status + " error =" + thrownError + " xhr.responseText = " + xhr.responseText );    
            },
            success: function (data) {
                alert("write json item, Ajax  OK");

            } 
    });

это в основном 2 этапа:

во-первых, вам нужно stringify как это

var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2); 

после этого вам нужно преобразовать строку в Object

var obj = JSON.parse(JSON_VAR);

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

например, если серверная часть ожидает множество людей, но в данном конкретном случае вы просто имеете дело с одним человеком. Потом делает:

<input type="hidden" name="People" value="Joe" />

тогда с предыдущими решениями он будет просто сопоставляться с чем-то вроде:

{
    "People" : "Joe"
}

но это действительно должно соответствовать

{
    "People" : [ "Joe" ]
}

чтобы исправить это, ввод должно выглядеть так:

<input type="hidden" name="People[]" value="Joe" />

и вы должны использовать следующую функцию (на основе других решений, но немного)

$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
    if (this.name.substr(-2) == "[]"){
        this.name = this.name.substr(0, this.name.length - 2);
        o[this.name] = [];
    }

    if (o[this.name]) {
        if (!o[this.name].push) {
            o[this.name] = [o[this.name]];
        }
        o[this.name].push(this.value || '');
    } else {
        o[this.name] = this.value || '';
    }
});
return o;
};