1229

オブジェクトをJSONにシリアライズする必要があります。jQueryを使用しています。これを行う「標準的な」方法はありますか?

私の特定の状況: 以下に示すように定義された配列があります。

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

$.ajax()これを次のように渡す文字列に変換する必要があります。

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

11 に答える 11

1155

JSON-js - JavaScript の JSON.

オブジェクトを文字列に変換するには、次を使用しますJSON.stringify

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

JSON 文字列をオブジェクトに変換するには、次を使用しますJSON.parse

var your_object = JSON.parse(json_text);

最近、 John Resigによって推奨されました。

...JSON を使用するアプリケーションを Crockford の json2.js に移行してください。ECMAScript 5 仕様と完全に互換性があり、ネイティブ (より高速な!) 実装が存在する場合は適切に機能を低下させます。

実際、JSON.parse メソッドが存在する場合はそれを利用するように昨日 jQuery に変更を加えたばかりで、完全に指定されています。

私は彼がJavaScriptの問題について言っていることを信頼する傾向があります:)

すべての最新のブラウザー(および古くない多くの古いブラウザー) は、JSON オブジェクトをネイティブにサポートしています。Crockford の JSON ライブラリの現在のバージョンは定義のみをJSON.stringify行いJSON.parse、まだ定義されていない場合は、ブラウザのネイティブ実装をそのまま残します。

于 2009-05-26T19:22:40.907 に答える
186

jquery-jsonを 6 か月間使用していますが、うまく機能しています。使い方はとても簡単です:

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

// Result: {"foo":"bar","baz":"wockaflockafliz"}
于 2011-06-01T21:40:58.990 に答える
101

IE8+で動作

jQuery は必要ありません。次を使用します。

JSON.stringify(countries); 
于 2011-08-29T06:57:32.720 に答える
46

私は使っていませんが、Mark Gibson によって書かれた jQuery プラグインを試してみてください。

$.toJSON(value)、の 2 つの関数が追加されます$.parseJSON(json_str, [safe])

于 2008-10-10T15:35:52.573 に答える
37

いいえ、JSON にシリアル化する標準的な方法は、既存の JSON シリアル化ライブラリを使用することです。これを行いたくない場合は、独自のシリアル化メソッドを作成する必要があります。

これを行う方法についてのガイダンスが必要な場合は、利用可能なライブラリのいくつかのソースを調べることをお勧めします。

編集:独自の serliazation メソッドを書くのが悪いと言うつもりはありませんが、アプリケーションで整形式の JSON を使用することが重要である場合は、「もう 1 つ」のオーバーヘッドを検討する必要があることを考慮する必要がありますカスタムメソッドが、予期していなかった失敗ケースに遭遇する可能性があるという可能性に対して。そのリスクを許容できるかどうかは、あなた次第です。

于 2008-10-10T15:47:13.173 に答える
30

私はこれをどこかで見つけました。どこか思い出せません...おそらく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;
};
于 2011-01-02T07:57:40.227 に答える
11

外部ライブラリを使用したくない場合は.toSource()、ネイティブの JavaScript メソッドがありますが、完全にクロスブラウザーではありません。

于 2009-12-01T21:44:16.797 に答える
11

はい、 電話する前に次のことを行う必要がJSON.stringifyありJSON.parseます。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");

        } 
});
于 2016-03-24T03:50:13.320 に答える
10

それは基本的に 2 ステップのプロセスです。

まず、次のように文字列化する必要があります。

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

その後、 を に変換する必要がありstringますObject

var obj = JSON.parse(JSON_VAR);
于 2015-06-29T13:21:03.170 に答える
10

最良の方法は、 JSONオブジェクトのポリフィルを含めることです。

ただし、jQuery 名前空間内でオブジェクトを JSON 表記 ( JSON の有効な値) にシリアル化するメソッドを作成する必要がある場合は、次のようにすることができます。

実装

// 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);
于 2015-04-11T05:50:05.573 に答える