2009-05-01 15 views
2

JSONオブジェクトをネストされたフォームフィールドに変換するには、誰かが良い方法を知っています。例えばJSONオブジェクトをネストされたフォームフィールドに変換しますか?

:JSONオブジェクト考える:

{'a':{'b':{'c':'1200'}}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}} 

を私が取得する必要があります。

{'a[b][c]':'1200', 'z':'foo', 'bar[baz]':'1', 'bar[id]':2}; 

任意のアイデア?

私は現在jqueryを使用していますが、このようなものが既に存在していると感じています。単にクレイジーアルゴリズムで自分自身をロールバックすることはできますが、実績のある実績を使っています。

+1

ネストされたフォームフィールドは何ですか?これらのフィールドセット要素はありますか?私はあなたが最初のオブジェクトから2番目のオブジェクトに到達することを意味しているアルゴリズムについては、あまり理解していません。 – Anonymous

+0

ええと、まったく、この混乱は何ですか?あなたはもっと文脈がなくても全体的に意味をなさないので、何らかの明確化を提供する必要があるかもしれません... –

+0

あなたは既に要素をobj ['a'] ['b' ['c' ]あなたのフォームフィールドのトラバースアルゴリズムを少し改善しましたか? – Thevs

答えて

3

あなたはあなたがしたいと言っていることをなぜ望んでいるのかわからないし、私たちはすべて私たちを埋めることを望むが、このコードはそれを微調整するのに十分近い)some code of mine that I use to find differences in JavaScript object graphsに基づいています。ここでは

function doStrangeThing(obj) { 
    var propertyChanges = []; 
    var objectGraphPath = []; 
    (function(obj, refObj) { 
     if (obj.constructor == Object || (obj.constructor != Number && 
      obj.constructor != String && obj.constructor != Date && obj.constructor != Boolean && 
      obj.constructor != RegExp && obj.constructor != Function)) { 
      for (var property in obj) { 
       objectGraphPath.push((objectGraphPath.length > 0) ? "[" + property + "]" : property); 
       if (obj[property].constructor != Function) { 
        if (!refObj[property]) refObj[property] = {}; 
        arguments.callee(obj[property], refObj[property]); 
       } 
       objectGraphPath.pop(); 
      } 
     } else if (obj.constructor != Function) { 
      if (obj != refObj) { 
       propertyChanges.push("\"" + objectGraphPath.join("") + "\":\"" + obj.toString() + "\""); 
      } 
     } 
    })(obj, {}); 
    return "{" + propertyChanges.join(",") + "}"; 
} 

は、私はそれをテストするためにやったことです:

この値になり
doStrangeThing({'a':{'b':{'c':'1200'}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}}); 

{"a[b][c]":"1200","z":"foo","bar[baz]":"1","bar[id]":"2"} 
いくつかの方法であなたに便利です

希望...

+0

これが一度サーバー側に到達すると、PHPではネストされたハッシュマップになります。 – user86847

+0

それはあなたのために働く場合、答えとしてマークしてください - 私はPHPやこれの必要性については何も知らないが、明らかにあなたの理由があります。:)もう少し前にこのコードを書いていたので、もう一度、ちょうどあなたがそれを好きにしているようにするために少し微調整を使うかもしれませんが、これは比較的速くテストして遊んでいました。 –

+0

"tweak"と言っても、値の型が正しく働くことを意味します。 "bar [id]"の値を文字列(2) ) - 何かが数字であるかどうかを調べるためにテストするコードを微調整することができます。そうであれば、引用を使用しないでください。 –

1
obj = {'a':{'b':{'c':'1200'}}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}} 

{['a']['b']['c']:'1200', ['z']:'foo', ['bar']['baz']:'1', ['bar']['id']:2} 

に内部的に同等であるが、これはもうJSONオブジェクトではありませんのでご注意ください。

あなたは既にこのように最初のオブジェクトのプロパティを参照できます。

var z = obj['a']['b']['c'] // 1200 

は、それはあなたのニーズには十分ですか?本当にプロパティ名を変数に変換したいですか?

+0

私はこの質問を読んだとき、私が感じたのと同じ感覚を持っていると思うので、私はこの答えを読むときに笑わなければなりませんでした。つまり、この男はこの混乱と関係しますか?それにもかかわらず興味深い練習でしたが、私は "未知"がPHPでこのようなことをしているのかどうかわかりません。奇妙なもの。 –

+0

実際、彼は自分が望むものを手に入れました。かなり奇妙ですが、それはいくつかの意味を持っています。しかし、同じ目的を達成するためのアルゴリズム的な方法は、もっと簡単です...そして、変数名と名前空間を持つ大混乱があります。 – Thevs

0

実際には、入れ子になったJSONオブジェクトを取得してHTTP POST文字列に変換する関数をお勧めします。 jQueryは、HTTPパラメータを必要とするすべての引数に対してこれを受け入れます。

私が書かれており、いくつかの生産のアプリ(ご自身の責任で使用)で、以下の機能を使用していた

$.httpSerialize = function(items, parentName) { 
    var serializedItems = [], serialize = arguments.callee, encodeItem =  function(key, value) { 
     if (value === null || typeof value == 'undefined') return value; 
     if (value.constructor == Array) {return serialize(value, key);} 
     return (value.constructor == Object) 
      ? serialize(value, key) 
      : (value === true || value === false) 
       ? key+"="+new Number(value) 
       : key+"="+encodeURIComponent(value); 
    }; 

    if (items.constructor == Array) { 
     parentName = parentName || 'item'; 
     for (var i = 0; i < items.length; i++) { 
      var key = parentName+'['+i+']', value = items[i]; 
      serializedItems.push(encodeItem(key, value)); 
     } 
    } else { 
     parentName = parentName || ''; 
     for (var key in items) { 
      var value = items[key]; 
      if (parentName) { 
       serializedItems.push(encodeItem(parentName+'['+encodeURIComponent(key)+']', value)); 
      } else { 
       serializedItems.push(encodeItem(encodeURIComponent(key), value)); 
      } 
     } 
    } 
    return serializedItems.join("&"); 
}; 
関連する問題