La sérialisation JSON en jQuery [dupliquer]

cette question a déjà une réponse ici:

je dois sérialiser un objet à JSON. Je suis à l'aide de jQuery. Est-il une façon "standard" pour ce faire?

Ma situation spécifique: j'ai un tableau défini comme indiqué ci-dessous:

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

et je dois en faire une chaîne pour passer à $.ajax() comme ceci:

$.ajax({
    type: "POST",
    url: "Concessions.aspx/GetConcessions",
    data: "{'countries':['ga','cd']}",
...
1151
demandé sur roy 2008-10-10 19:29:56
la source

11 ответов

JSON-js - JSON en JavaScript.

pour convertir un objet en chaîne, utilisez JSON.stringify :

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

pour convertir une chaîne JSON en objet, utilisez JSON.parse :

var your_object = JSON.parse(json_text);

il a été récemment recommandé par John Resig :

...Veuillez commencer la migration votre JSON-en utilisant des applications Le json2 de Crockford.js. Il est entièrement compatible avec L'ECMAScript 5 spécification et dégrade gracieusement si un natif (plus rapide!) application exister.

en fait, je viens d'atterrir un changement à jQuery hier qui utilise le JSON.méthode d'analyse, si elle existe, maintenant qu'il a été complètement spécifié.

j'ai tendance à croire ce qu'il dit sur les questions JavaScript:)

nouveaux navigateurs prise en charge de la JSON object nativement. La version actuelle de la bibliothèque JSON de Crockford ne définira JSON.stringify et JSON.parse que si elles ne sont pas déjà définies, laissant toute implémentation native du navigateur intacte.

1099
répondu Community 2014-09-09 18:57:28
la source

j'utilise jquery-json depuis 6 mois et ça marche très bien. C'est très simple à utiliser:

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

// Result: {"foo":"bar","baz":"wockaflockafliz"}
182
répondu Jay Taylor 2011-06-02 01:40:58
la source

Travaille sur IE8+

pas besoin de jQuery, utiliser:

JSON.stringify(countries); 
94
répondu pestatije 2012-04-17 14:30:52
la source

Je ne l'ai pas utilisé mais vous pourriez vouloir essayer le jQuery plugin écrit par Mark Gibson

il ajoute les deux fonctions: $.toJSON(value) , $.parseJSON(json_str, [safe]) .

44
répondu Tahir Akhtar 2013-08-15 18:58:56
la source

non, la façon standard de sérialiser à JSON est d'utiliser une bibliothèque de sérialisation JSON existante. Si vous ne voulez pas faire cela, alors vous allez avoir à écrire vos propres méthodes de sérialisation.

si vous voulez des conseils sur la façon de faire cela, je suggère d'examiner la source de certaines des bibliothèques disponibles.

EDIT: Je ne vais pas sortir et dire que l'écriture de vos propres méthodes de serlization est mauvais, mais vous devez considérez que s'il est important pour votre application d'utiliser JSON bien formé, alors vous devez peser la charge de "une dépendance de plus" contre la possibilité que vos méthodes personnalisées puissent un jour rencontrer un cas d'échec que vous n'aviez pas prévu. Que ce risque soit acceptable est votre décision.

35
répondu Adam Bellaire 2008-10-10 19:47:13
la source

j'ai trouvé ça quelque part. Ne peut pas se rappeler où... probablement sur 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;
};
27
répondu jmort253 2012-05-10 12:33:30
la source

si vous ne voulez pas utiliser des bibliothèques externes, il y a la méthode .toSource() native JavaScript, mais ce n'est pas tout à fait cross-browser.

11
répondu Kain Haart 2012-08-17 19:49:15
la source

la meilleure façon est d'inclure le polyfill pour JSON objet.

mais si vous insistez pour créer une méthode pour sérialiser un objet à la notation JSON ( valid values for JSON ) à l'intérieur de l'espace de noms jQuery, vous pouvez faire quelque chose comme ceci:

mise en Œuvre

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

Utilisation

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);
10
répondu jherax 2016-10-15 00:35:05
la source

Oui, vous devriez JSON.stringify et JSON.analysez votre "Json_PostData" avant d'appeler $.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");

            } 
    });
8
répondu bruce 2016-03-24 06:50:13
la source

c'est essentiellement un processus en deux étapes:

tout d'abord, vous devez stringify comme ceci

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

après cela, vous devez convertir la chaîne de caractères en objet

var obj = JSON.parse(JSON_VAR);
8
répondu Shrish Shrivastava 2017-06-07 11:29:30
la source

une chose que les solutions ci-dessus ne prennent pas en compte est si vous avez un tableau d'entrées mais seulement une valeur a été fournie.

par exemple, si l'extrémité arrière attend un éventail de personnes, mais dans ce cas particulier, vous avez juste affaire à une seule personne. Puis faire:

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

ensuite, avec les solutions précédentes, il serait juste mapper à quelque chose comme:

{
    "People" : "Joe"
}

mais il devrait vraiment correspondre à

{
    "People" : [ "Joe" ]
}

pour corriger cela, l'entrée devrait ressembler à:

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

et vous utiliseriez la fonction suivante (basée sur d'autres solutions, mais étendue un peu)

$.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;
};
7
répondu Tim Burkhart 2014-06-18 21:50:38
la source

Autres questions sur javascript jquery ajax json serialization