Pertanyaan Serialisasi ke JSON di jQuery [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya perlu membuat serial objek ke JSON. Saya menggunakan jQuery. Apakah ada cara "standar" untuk melakukan ini?

Situasi khusus saya: Saya memiliki sebuah array yang didefinisikan seperti yang ditunjukkan di bawah ini:

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

dan saya harus mengubahnya menjadi string untuk dilewatkan $.ajax() seperti ini:

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

1140
2017-10-10 15:29


asal


Jawaban:


JSON-js - JSON di JavaScript.

Untuk mengonversi objek ke string, gunakan JSON.stringify:

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

Untuk mengonversi string JSON ke objek, gunakan JSON.parse:

var your_object = JSON.parse(json_text);

Baru-baru ini direkomendasikan oleh John Resig:

... TOLONG mulai bermigrasi   aplikasi Anda yang menggunakan JSON ke   Json2.js Crockford. Itu sepenuhnya   kompatibel dengan ECMAScript 5   spesifikasi dan menurun secara anggun   jika implementasi asli (lebih cepat!)   ada.

Bahkan, saya baru saja mendarat di jQuery kemarin yang menggunakan   Metode JSON.parse jika ada, sekarang   bahwa itu telah sepenuhnya ditentukan.

Saya cenderung percaya apa yang dia katakan tentang hal-hal JavaScript :)

Peramban baru dukung Objek JSON secara asli. Versi terkini dari perpustakaan JSON Crockford hanya akan ditentukan JSON.stringify dan JSON.parse jika belum ditentukan, membiarkan implementasi asli browser apa pun utuh.


1091
2018-05-26 19:22



Saya telah menggunakan jquery-json selama 6 bulan dan itu bekerja dengan baik. Sangat mudah digunakan:

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

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

181
2018-06-01 21:40



Bekerja pada IE8 +

Tidak perlu untuk jQuery, gunakan:

JSON.stringify(countries); 

92
2017-08-29 06:57



Saya belum menggunakannya tetapi Anda mungkin ingin mencoba jQuery plugin yang ditulis oleh Mark Gibson 

Ia menambahkan dua fungsi: $.toJSON(value), $.parseJSON(json_str, [safe]).


43
2017-10-10 15:35



Tidak, cara standar untuk bersambung ke JSON adalah dengan menggunakan pustaka serialisasi JSON yang sudah ada. Jika Anda tidak ingin melakukan ini, maka Anda harus menulis metode serialisasi Anda sendiri.

Jika Anda ingin panduan tentang cara melakukan ini, saya sarankan memeriksa sumber dari beberapa pustaka yang tersedia.

EDIT: Saya tidak akan keluar dan mengatakan bahwa menulis metode pengacakan Anda buruk, tetapi Anda harus mempertimbangkan bahwa jika aplikasi Anda penting untuk menggunakan JSON yang terbentuk dengan baik, maka Anda harus mempertimbangkan biaya tambahan "satu ketergantungan lagi" terhadap kemungkinan bahwa metode kustom Anda mungkin suatu hari menemukan kasus kegagalan yang tidak Anda antisipasi. Apakah risiko itu dapat diterima adalah panggilan Anda.


34
2017-10-10 15:47



Saya menemukan ini di suatu tempat. Tidak ingat di mana ... mungkin di 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



Jika Anda tidak ingin menggunakan perpustakaan eksternal ada .toSource() metode JavaScript asli, tetapi tidak sempurna lintas-browser.


10
2017-12-01 21:44



Cara terbaik adalah memasukkan polyfill untuk JSON obyek.

Tetapi jika Anda bersikeras membuat metode untuk membuat serial objek ke notasi JSON (nilai valid untuk JSON) di dalam namespace jQuery, Anda dapat melakukan sesuatu seperti ini:

Pelaksanaan

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

Pemakaian

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



Ya, Anda harus JSON.stringify dan JSON.parse "Json_PostData" Anda sebelum memanggil $ .ajax

$ .ajax ({
            url: post_http_site,
            ketik: "POST",
            data: JSON.parse (JSON.stringify (Json_PostData)),
            cache: salah,
            error: function (xhr, ajaxOptions, thrownError) {
                alert ("tulis json item, Ajax error!" + xhr.status + "error =" + thrownError + "xhr.responseText =" + xhr.responseText);
            },
            success: function (data) {
                alert ("tulis json item, Ajax OK");

            }
    });

7
2018-03-24 03:50



Ini pada dasarnya proses 2 langkah:

Pertama, Anda perlu merangkai seperti ini

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

Setelah itu, Anda perlu mengonversi string ke Object

var obj = JSON.parse(JSON_VAR);

7
2018-06-29 13:21



Satu hal yang tidak dipertimbangkan oleh solusi di atas adalah jika Anda memiliki serangkaian input tetapi hanya satu nilai yang diberikan.

Misalnya, jika bagian belakang mengharapkan suatu array Orang, tetapi dalam kasus ini, Anda hanya berurusan dengan satu orang. Kemudian lakukan:

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

Kemudian dengan solusi sebelumnya, itu hanya akan memetakan ke sesuatu seperti:

{
    "People" : "Joe"
}

Tapi itu harus benar-benar memetakan

{
    "People" : [ "Joe" ]
}

Untuk memperbaikinya, input akan terlihat seperti:

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

Dan Anda akan menggunakan fungsi berikut (berdasarkan solusi lain, tetapi sedikit diperluas)

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

6
2018-06-18 15:49