Question Sérialisation en JSON dans jQuery [en double]


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

Je dois sérialiser un objet à JSON. J'utilise jQuery. Existe-t-il un moyen "standard" de le 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 transformer cela en une chaîne pour passer à $.ajax() comme ça:

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

1140
2017-10-10 15:29


origine


Réponses:


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:

... S'IL VOUS PLAÎT commencer à migrer   vos applications utilisant JSON sur   Json2.js de Crockford. C'est entièrement   compatible avec l'ECMAScript 5   spécification et dégrade gracieusement   si une implémentation native (plus rapide!)   existe.

En fait, je viens d'atterrir un changement de jQuery hier qui utilise le   Méthode JSON.parse si elle existe, maintenant   qu'il a été complètement spécifié.

J'ai tendance à croire ce qu'il dit sur JavaScript compte :)

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


1091
2018-05-26 19:22



J'ai utilisé jquery-json pour 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"}

181
2018-06-01 21:40



Fonctionne sur IE8 +

Pas besoin de jQuery, utilisez:

JSON.stringify(countries); 

92
2017-08-29 06:57



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

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


43
2017-10-10 15:35



Non, la façon standard de sérialiser en JSON consiste à utiliser une bibliothèque de sérialisation JSON existante. Si vous ne le souhaitez pas, vous devrez é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.

MODIFIER: Je ne vais pas sortir et dire que l'écriture de vos propres méthodes de sérialisation est mauvaise, mais vous devez considérer que s'il est important pour votre application d'utiliser un JSON bien formé, alors vous devez peser les frais généraux d'une dépendance supplémentaire. contre la possibilité que vos méthodes personnalisées rencontrent un jour un cas d'échec que vous n'aviez pas prévu. Que ce risque soit acceptable, c'est votre appel.


34
2017-10-10 15:47



Je l'ai trouvé quelque part. Je ne me souviens plus où ... mais 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;
};

26
2018-01-02 07:57



Si vous ne voulez pas utiliser de bibliothèques externes, il y a .toSource() méthode native JavaScript, mais ce n'est pas parfaitement cross-navigateur.


10
2017-12-01 21:44



Le meilleur moyen est d'inclure le polyfill pour JSON objet.

Mais si vous insistez pour créer une méthode de sérialisation d'un objet en notation JSON (Valeurs valides pour JSON) dans l'espace de noms jQuery, vous pouvez faire quelque chose comme ceci:

la mise en oeuvre

// 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
2018-04-11 05:50



Oui, vous devriez utiliser JSON.stringify et JSON.parse votre "Json_PostData" avant d'appeler $ .ajax

$ .ajax ({
            url: post_http_site,
            tapez: "POST",
            data: JSON.parse (JSON.stringify (Json_PostData)),
            cache: faux,
            erreur: function (xhr, ajaxOptions, thrownError) {
                alert ("écrire élément json, erreur Ajax!" + xhr.status + "error =" + thrownError + "xhr.responseText =" + xhr.responseText);
            },
            succès: function (données) {
                alert ("write json item, Ajax OK");

            }
    });

7
2018-03-24 03:50