2013-07-12 15 views
7

の異なる実装間の奇数の違いに着目さんは、私はこのようなかなりのネストされたJSオブジェクトを持っていると私はそれをJSON-エンコードするために必要としましょう:JSON.stringify

var foo = { 
    "totA": -1, 
    "totB": -1, 
    "totC": "13,052.00", 
    "totHours": 154, 
    "groups": [ 
     {"id": 1, 
     "name": "Name A", 
     "billingCodes": [ 
      {"bc": "25", "type": "hours", "hours": "5", "amount": "$25.00"} 
     ]} 
    ] 
}; 

Iネイティブを使用してJSONをエンコードした場合ブラウザJSON.stringify(クロム、Firefoxの、IE9/10でテスト)、私は(私が何を期待している)、バックのようになりますJSON文字列を取得:

Native JSON.stringify JSFiddle example

{ 
    "totA": -1, 
    "totB": -1, 
    "totC": "13,052.00", 
    "totHours": 154, 
    "groups": [ 
     { 
      "id": 1, 
      "name": "Name A", 
      "billingCodes": [ 
       { 
        "bc": "25", 
        "type": "hours", 
        "hours": "5", 
        "amount": "$25.00" 
       } 
      ] 
     } 
    ] 
} 

PrototypeJSまたはjson2.jsのいずれかのページで同じことをしようとすると奇妙なことが起こります。その場合

JSON.stringify同じオブジェクトは私に次のようなJSONバック与えに:明らか

ProtypeJS JSON.stringify JSFiddle example

{ 
    "totA": -1, 
    "totB": -1, 
    "totC": "13,052.00", 
    "totHours": 154, 
    "groups": "[{\"id\": 1, \"name\": \"Name A\", \"billingCodes\": [{\"bc\": \"25\", \"type\": \"hours\", \"hours\": \"5\", \"amount\": \"$25.00\"}]}]" 
} 

をそれがJSONデコードしないので、上記の問題であり、もともとJSON.stringifyに渡されたものと同じです。

誰でも何が起こっているのか、なぜこの違いがあるのか​​を詳しく説明できますか?

私には何が欠けていますか?

+0

これはバグかもしれないようですが、プロトタイプ1.7.1を使用するようにフィドルを変更すると、期待される結果が得られるようです。これを見てください:https://github.com/bestiejs/json3/issues/8 – HBP

+0

JSONは 'groups'配列全体をエンコードしたようです。 –

+2

重複していますか? http://stackoverflow.com/questions/710586/json-stringify-bizarreness ...その質問の答えから、 'Array.prototype.toJSON'を削除してください。 –

答えて

7

これはネイティブJSON.stringifytoJSONのメソッドを尊重し、Prototypeがこれらをすべて追加するためです。残念ながら、nativeとPrototypeは異なる方法でtoJSONを理解しているように見えます。ネイティブは文字列をリテラル値として返しますが、PrototypeのtoJSONは既にフォーマットされたJSONのチャンクをそのまま返します。したがって、不一致。

これは正常に動作します:

delete Array.prototype.toJSON; 
document.getElementById('out').innerHTML += JSON.stringify(foo); 

http://jsfiddle.net/Ky3tv/2/

また、これはプロトタイプ1.7で修正されているように見えます。私は今彼らがtoJSONメソッドを追加する前にネイティブJSONをチェックしていると思います。

+0

私は彼がなぜ違いがあるのか​​と尋ねていると思います。 –

+0

@Derek朕會功夫:はい、これを説明するために編集しました。 – georg