0

いくつかのJSONデータを取得しています。その最も単純な例は、単一の行を保持することです。

{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }

それはよく形成されているようです:

>>> console.log({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] })
Object { max=[1]}

しかし、私が試してみると:

>>> $.parseJSON("{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }");

SyntaxError: JSON.parse: expected property name or '}'

どうしてこれなの?

みんなありがとう、私はJavaScriptObjectNotationとStrictJSONの違いに気づいていませんでした。次のように出力するように変更しました。

{ "max": [[1353007547000,70.0000]] }

このデータのコンテキストは、ajaxを介していくつかのHighChartsデータをロードするためのものでしたが、すべての例は上記の形式であり、ajaxはありませんでした。

4

4 に答える 4

7

JSONは厳格な標準であり、たまたまJavascriptのサブセットです。Dateこれは省略されているものの1つです。日付が必要な場合は、文字列(またはint)として転送する必要があります。コードは有効なJavaScriptですが、有効なJSONではありません。

于 2013-03-15T14:50:36.843 に答える
2

あなたはまだ本当のJSONではなくJSONのようなJavaScriptオブジェクトを扱っています。.parseJSONの場合、厳密なJSONが必要です。

つまり、Dateオブジェクトは文字列である必要があり、プロパティ名は二重引用符で囲む必要があります。

http://jsonlint.com/のようなツールは、多くの場合非常に役立ちます。

@ c4pは、最初にJavaScriptオブジェクトでJSON.stringifyを使用することを提案しています。これは、解析前に調整が必要な多くのことを処理することが多いため、多くの場合、良い最初のステップです。

于 2013-03-15T15:04:18.253 に答える
1

JavascriptオブジェクトをJSONにダンプする場合:

JSON.stringify({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] });

"{"max":[[1361538673000,999]]}"

maxキーが文字列"max"になり、Dateがタイムスタンプに変換されたことに注意してください。

于 2013-03-15T14:54:35.403 に答える
0

日付はjavascriptオブジェクトであり、JSONの一部ではありません。シリアル化されたフォームを介してjavascript関数呼び出しを渡そうとしていますが、これは機能しません。

コンソールログで機能する理由は、console.logが呼び出される前にDate.UTC関数が値に解決されるためです。この文字列は元々、関数を実行できるeval(リテラルjavascriptを実行する)に渡されることを意図して設定されたようで、parseJSONを使用して脆弱性を軽減しようとしています(これは良いことです!)。

ここでの解決策は、受信するJSONデータをどの程度制御できるかによって異なります。コントロールがゼロの場合、evalの使用を余儀なくされる可能性があります。それ以外の場合、jsonにはUTCに渡されるパラメーター(またはタイムスタンプ自体)の配列が含まれている必要があり、それが解析されたときに、結果に対してDate.UTCを呼び出してUTC日付を取得する必要があります。

于 2013-03-15T14:55:56.727 に答える