Вопрос: Сериализация в 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']}",
...

1134


источник


Ответы:


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 от Crockford будет определять только JSON.stringifyа также JSON.parseесли они еще не определены, оставив всю встроенную версию браузера неповрежденной.


1089



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

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

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

181



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

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

JSON.stringify(countries); 

92



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

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


43



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

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

РЕДАКТИРОВАТЬ: Я не собираюсь выходить и говорить, что писать свои собственные методы серллизации плохо, но вы должны учитывать, что если для вашего приложения важно использовать хорошо сформированный JSON, тогда вам нужно взвесить накладные расходы «еще одной зависимости», против возможности того, что ваши пользовательские методы могут когда-нибудь столкнуться с неудачным случаем, которого вы не ожидали. Является ли этот риск приемлемым, так это ваш звонок.


34



Я нашел это где-то. Не могу вспомнить, где, хотя ... возможно, на 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;
};

26



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


10



The best way is to include the polyfill for JSON object.

But if you insist create a method for serializing an object to JSON notation (valid values for JSON) inside the jQuery namespace, you can do something like this:

Implementation

// This is a reference to JSON.stringify and provides a polyfill for old browsers.
// stringify serializes an object, array or primitive value and return it as JSON.
jQuery.stringify = (function ($) {
  var _PRIMITIVE, _OPEN, _CLOSE;
  if (window.JSON && typeof JSON.stringify === "function")
    return JSON.stringify;

  _PRIMITIVE = /string|number|boolean|null/;

  _OPEN = {
    object: "{",
    array: "["
  };

  _CLOSE = {
    object: "}",
    array: "]"
  };

  //actions to execute in each iteration
  function action(key, value) {
    var type = $.type(value),
      prop = "";

    //key is not an array index
    if (typeof key !== "number") {
      prop = '"' + key + '":';
    }
    if (type === "string") {
      prop += '"' + value + '"';
    } else if (_PRIMITIVE.test(type)) {
      prop += value;
    } else if (type === "array" || type === "object") {
      prop += toJson(value, type);
    } else return;
    this.push(prop);
  }

  //iterates over an object or array
  function each(obj, callback, thisArg) {
    for (var key in obj) {
      if (obj instanceof Array) key = +key;
      callback.call(thisArg, key, obj[key]);
    }
  }

  //generates the json
  function toJson(obj, type) {
    var items = [];
    each(obj, action, items);
    return _OPEN[type] + items.join(",") + _CLOSE[type];
  }

  //exported function that generates the json
  return function stringify(obj) {
    if (!arguments.length) return "";
    var type = $.type(obj);
    if (_PRIMITIVE.test(type))
      return (obj === null ? type : obj.toString());
    //obj is array or object
    return toJson(obj, type);
  }
}(jQuery));

Usage

var myObject = {
    "0": null,
    "total-items": 10,
    "undefined-prop": void(0),
    sorted: true,
    images: ["bg-menu.png", "bg-body.jpg", [1, 2]],
    position: { //nested object literal
        "x": 40,
        "y": 300,
        offset: [{ top: 23 }]
    },
    onChange: function() { return !0 },
    pattern: /^bg-.+\.(?:png|jpe?g)$/i
};

var json = jQuery.stringify(myObject);
console.log(json);

9



Yes, you should JSON.stringify and JSON.parse your "Json_PostData" before calling $.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");

            } 
    });

7



It's basically 2 step process:

First, you need to stringify like this

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

After that, you need to convert the string to Object

var obj = JSON.parse(JSON_VAR);

7



One thing that the above solutions don't take into account is if you have an array of inputs but only one value was supplied.

For instance, if the back end expects an array of People, but in this particular case, you are just dealing with a single person. Then doing:

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

Then with the previous solutions, it would just map to something like:

{
    "People" : "Joe"
}

But it should really map to

{
    "People" : [ "Joe" ]
}

To fix that, the input should look like:

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

And you would use the following function (based off of other solutions, but extended a bit)

$.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;
};

6