Вопрос:

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

javascript jquery ajax json serialization

823142 просмотра

11 ответа

23431 Репутация автора

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

Мне нужно сериализовать объект в 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 Источник Размещён: 10.10.2008 03:29

Ответы (11)


44 плюса

8472 Репутация автора

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

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

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

35 плюса

78425 Репутация автора

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

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

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

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

1101 плюса

0 Репутация автора

Решение

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

11 плюса

139 Репутация автора

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

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

27 плюса

28077 Репутация автора

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

182 плюса

8071 Репутация автора

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

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

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

94 плюса

981 Репутация автора

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

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

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

7 плюса

518 Репутация автора

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

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

<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

10 плюса

4206 Репутация автора

Лучший способ - включить полис для объекта 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 плюса

310 Репутация автора

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

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

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

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

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

8 плюса

359 Репутация автора

Да, вы должны 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
Вопросы из категории :
32x32