Сериализация JSON в jQuery

javascript jquery ajax json serialization

823142 просмотра

11 ответа

На этот вопрос уже есть ответ:

Мне нужно сериализовать объект в JSON. Я использую jQuery. Существует ли «стандартный» способ сделать это?

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

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

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

$.ajax({
    type: "POST",
    url: "Concessions.aspx/GetConcessions",
    data: "{'countries':['ga','cd']}",
...
Автор: Herb Caudill Источник Размещён: 17.05.2019 03:52

Ответы (11)


1101 плюса

Решение

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 от Crockford. Он полностью совместим с спецификацией ECMAScript 5 и изящно деградирует, если существует нативная (быстрая!) Реализация.

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

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

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

Автор: user18015 Размещён: 26.05.2009 07:22

182 плюса

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

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

// Result: {"foo":"bar","baz":"wockaflockafliz"}
Автор: Jay Taylor Размещён: 01.06.2011 09:40

94 плюса

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

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

JSON.stringify(countries); 
Автор: pestatije Размещён: 29.08.2011 06:57

44 плюса

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

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

Автор: Tahir Akhtar Размещён: 10.10.2008 03:35

35 плюса

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

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

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

Автор: Adam Bellaire Размещён: 10.10.2008 03:47

27 плюса

Я нашел это где-то. Не могу вспомнить, где, хотя ... возможно, на 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;
};
Автор: jmort253 Размещён: 02.01.2011 07:57

11 плюса

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

Автор: Kain Haart Размещён: 01.12.2009 09:44

10 плюса

Лучший способ - включить полис для объекта JSON .

Но если вы настаиваете на создании метода сериализации объекта для нотации JSON ( допустимые значения для JSON ) внутри пространства имен jQuery, вы можете сделать что-то вроде этого:

Реализация

// 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));

использование

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);
Автор: jherax Размещён: 11.04.2015 05:50

8 плюса

Это в основном двухэтапный процесс:

Во-первых, вам нужно

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

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

var obj = JSON.parse(JSON_VAR);
Автор: Shrish Shrivastava Размещён: 29.06.2015 01:21

8 плюса

Да, вы должны 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");

        } 
});
Автор: bruce Размещён: 24.03.2016 03:50

7 плюса

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

Например, если задний конец ожидает массив людей, но в данном конкретном случае вы просто имеете дело с одним человеком. Затем выполните:

<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;
};
Автор: Tim Burkhart Размещён: 18.06.2014 03:49
Вопросы из категории :
32x32