javascript serialize - Serialisieren zu JSON in jQuery




form to (10)

Diese Frage hat hier bereits eine Antwort:

Ich muss ein Objekt zu JSON serialisieren. Ich benutze jQuery. Gibt es einen "Standard" Weg dies zu tun?

Meine spezifische Situation: Ich habe ein Array wie folgt definiert:

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

und ich muss dies in eine Zeichenfolge $.ajax() , die folgendermaßen an $.ajax() wird:

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

Answers

Der beste Weg besteht darin, das Polyfill für das JSON-js Objekt einzuschließen.

Wenn Sie jedoch darauf bestehen, eine Methode zum Serialisieren eines Objekts in JSON-Notation ( gültige Werte für JSON ) im jQuery-Namespace zu erstellen, können Sie Folgendes tun:

Implementierung

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

Verwendung

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

Nein, die Standardmethode zum Serialisieren in JSON besteht darin, eine vorhandene JSON-Serialisierungsbibliothek zu verwenden. Wenn Sie das nicht möchten, müssen Sie Ihre eigenen Serialisierungsmethoden schreiben.

Wenn Sie eine Anleitung dazu benötigen, würde ich vorschlagen, die Quelle einiger verfügbarer Bibliotheken zu untersuchen.

EDIT: Ich werde nicht kommen und sagen, dass das Schreiben Ihrer eigenen Serliazation Methoden schlecht ist, aber Sie müssen bedenken, dass, wenn es wichtig für Ihre Anwendung ist, wohlgeformtes JSON zu verwenden, dann müssen Sie den Overhead von "einem mehr Abhängigkeit "gegen die Möglichkeit, dass Ihre benutzerdefinierten Methoden eines Tages auf einen Fehlerfall stoßen, den Sie nicht erwartet haben. Ob dieses Risiko akzeptabel ist, ist Ihr Anruf.


JSON-js - JSON in JavaScript.

Verwenden Sie JSON.stringify um ein Objekt in eine Zeichenfolge zu JSON.stringify :

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

Verwenden Sie JSON.parse um eine JSON-Zeichenfolge in ein Objekt zu JSON.parse :

var your_object = JSON.parse(json_text);

Es wurde kürzlich von John Resig empfohlen:

... Bitte starten Sie die Migration Ihrer JSON-Anwendungen zu Crockfords json2.js. Es ist vollständig kompatibel mit der ECMAScript 5-Spezifikation und wird leicht degradiert, wenn eine native (schnellere!) Implementierung existiert.

In der Tat, ich habe gestern eine Änderung in jQuery gestern, die JSON.parse-Methode verwendet, wenn es existiert, jetzt, nachdem es vollständig angegeben wurde.

Ich neige dazu zu vertrauen, was er in Sachen JavaScript sagt :)

Neuere Browser unterstützen das JSON-Objekt nativ. Die aktuelle Version der JSON-Bibliothek von Crockford definiert JSON.stringify und JSON.parse nur dann, wenn sie noch nicht definiert sind, sodass die JSON.stringify Implementierung intakt bleibt.


Es ist im Grunde 2-Schritt-Prozess:

Zuerst müssen Sie so stringieren

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

Danach müssen Sie die Zeichenfolge in Objekt konvertieren

var obj = JSON.parse(JSON_VAR);

Eine Sache, die die obigen Lösungen nicht berücksichtigen, ist, wenn Sie ein Array von Eingängen haben, aber nur ein Wert geliefert wurde.

Zum Beispiel, wenn das Backend ein Array von People erwartet, aber in diesem speziellen Fall handelt es sich nur um eine einzelne Person. Dann mache ich:

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

Dann würde es mit den vorherigen Lösungen zu etwas wie:

{
    "People" : "Joe"
}

Aber es sollte wirklich zu mappen

{
    "People" : [ "Joe" ]
}

Um das zu beheben, sollte die Eingabe wie folgt aussehen:

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

Und Sie würden die folgende Funktion verwenden (basierend auf anderen Lösungen, aber ein wenig erweitert)

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

Ich habe das irgendwo gefunden. Kann mich nicht erinnern, wo ... aber wahrscheinlich auf :)

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

Ich jquery-json seit 6 Monaten jquery-json und es funktioniert jquery-json . Es ist sehr einfach zu benutzen:

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

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

Ja, Sie sollten JSON.stringify und JSON.parse Ihre "Json_PostData" vor dem Aufruf von $ .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");

            } 
    });

Ich habe es nicht benutzt, aber vielleicht möchten Sie das jQuery-Plugin von Mark Gibson ausprobieren

Es fügt die zwei Funktionen hinzu: $.toJSON(value) , $.parseJSON(json_str, [safe]) .


Es verhindert JSON-Hijacking , ein wichtiges JSON-Sicherheitsproblem, das in allen großen Browsern seit 2011 mit ECMAScript 5 formal fixed .

Behauptetes Beispiel: Angenommen, Google hat eine URL wie mail.google.com/json?action=inbox die die ersten 50 Nachrichten Ihres Posteingangs im JSON-Format zurückgibt. Böse Websites in anderen Domänen können aufgrund der Richtlinie mit demselben Ursprung keine AJAX-Anfragen zum Abrufen dieser Daten stellen. Sie können jedoch die URL über ein <script> -Tag angeben. Die URL wird mit Ihren Cookies besucht. Durch das Überschreiben der globalen Array-Konstruktor- oder Zugriffsmethoden kann eine Methode aufgerufen werden, wenn ein Objektattribut (Array oder Hash-Attribut) gesetzt wird, wodurch der JSON-Inhalt gelesen werden kann.

Die while(1); oder &&&BLAH&&& verhindert dies: Eine AJAX-Anfrage bei mail.google.com hat vollen Zugriff auf den Textinhalt und kann ihn entfernen. Durch das Einfügen eines <script> -Tags wird das JavaScript jedoch blind ohne Verarbeitung ausgeführt, was entweder zu einer Endlosschleife oder zu einem Syntaxfehler führt.

Das Problem der standortübergreifenden Anforderungsfälschung wird nicht angesprochen .







javascript jquery ajax json serialization