説明
JSON (JavaScript Object Notation) 文字列データ表現を CFML データ (CFML 構造体や CFML 配列など) に変換します。
戻り値
ColdFusion 形式のデータ値 : 構造体、配列、クエリー、単純値
カテゴリ
シンタックス
DeserializeJSON(JSONVar[, strictMapping, useCustomSerializer]) |
関連項目
IsJSON、SerializeJSON、cfajaxproxy、『ColdFusion アプリケーションの開発』の Ajax データ機能および開発機能の使用、http://www.json.org
履歴
ColdFusion 11:useCustomSerializer 属性が追加されました。
ColdFusion 8: この関数が追加されました。
パラメータ
パラメータ |
説明 |
---|---|
JSONVar |
有効な JSON 構造を含む文字列、または JSON 構造を表す変数です。 |
strictMapping |
JSON を厳密に変換するかどうかを指定する boolean 値です。
|
useCustomSerializer | true と false のいずれかを使用し、customSerializer を使用するかどうかを指定します。デフォルト値は true です。シリアル化解除には必ず、カスタムシリアライザーが使用されます。false の場合、JSON シリアル化解除はデフォルトの ColdFusion ビヘイビアーを使用して実行されます。 |
使用方法
この関数は、ColdFusion ページでデータを JSON 文字列として受け取る場合に使用すると便利です。クライアントブラウザ上のデータ表現に Ajax を使用する ColdFusion アプリケーションでこの関数を使用すると、クライアントサイドの Ajax JavaScript からの JSON 形式データをサーバーで利用できます。また、この関数をページで使用すると、JSON パラメーターを含む JavaScript 関数呼び出しとしてデータを提供するサービスからデータを取得できます。次の例は、このケースを示しています。DeserializeJSON 関数は、次のように JSON データ型を ColdFusion データ型に直接変換します。
- strictMapping パラメータが true(デフォルト)の場合、JSON オブジェクトはすべて CFML 構造体に変換されます。
- strictMapping パラメータが false の場合は、JSON オブジェクトがクエリーを表しているかどうかを判断し、クエリーが表されている場合はそれらを ColdFusion クエリーオブジェクトに変換します。その他すべての JSON オブジェクトは ColdFusion 構造体に変換されます。SerializeJSON のリファレンスで説明されている 2 種類のクエリー表現のいずれかが JSON 構造体で使用されている場合、DeserializeJSON 関数はその構造体をクエリーとして認識して正しく変換します。
- JSON の配列、文字列、数値は、それぞれ ColdFusion の配列、文字列、数値に変換されます。
- JSON の null 値は、文字列 null に変換されます。
- 日付と時刻の JSON 文字列表現は文字列のまま変換されませんが、ColdFusion の日付時刻処理コードでは、それらを日付と時刻を示すデータとして認識できます。
例
この例では、SerializeJSON関数の例によって生成される JSON 形式データフィードから天気情報を表示します。このようなコードでは、JavaScript ページとしてエクスポートされるデータを利用する場合もあります。このフィードは JavaScript 関数呼び出しの形式を持ち、フィードのデータを含む JSON 文字列がパラメータとして指定されています。この例では、次の処理を行います。
- cfhttp タグを使用してフィードを取得します(cfhttp.fileContent 変数)。
- テキストから関数呼び出しラッパーを取り除きます。
- IsJSON 関数を使用して、前の処理の結果が有効な JSON 形式文字列であるかどうかを確認します。有効でない場合は、メッセージを表示して処理を停止します。
- 文字列が有効な JSON テキストである場合は、DeserializeJSON 関数を使用して文字列を ColdFusion 変数に変換します。この例では、ColdFusion クエリーを表す 2 つの配列を含む構造体に変換されます。最初の配列にはクエリー列名、2 つ目の配列にはクエリーデータが格納されます。
オブジェクトを解析し、配列の内容を表示します。
この例を実行するときは、このファイルと SerializeJSON 関数の例を ColdFusion の Web ルート下の適切な場所に置き、URL をシリアル化の例の URL に置き換えてから、このページを実行してください。<!--- Get the JSON Feed --->
<cfhttp url="http://localhost:8500/My_Stuff/Ajax/Books/CreateJSON_NEW.cfm">
<!--- JSON data is sometimes distributed as a JavaScript function.
The following REReplace functions strip the function wrapper. --->
<cfset theData=REReplace(cfhttp.FileContent,
"^\s*[[:word:]]*\s*\(\s*","")>
<cfset theData=REReplace(theData, "\s*\)\s*$", "")>
<!--- Test to make sure you have JSON data. --->
<cfif !IsJSON(theData)>
<h3>The URL you requested does not provide valid JSON</h3>
<cfdump var="#theData#">
<!--- If the data is in JSON format, deserialize it. --->
<cfelse>
<cfset cfData=DeserializeJSON(theData)>
<!--- Parse the resulting array or structure and display the data.
In this case, the data represents a ColdFusion query that has been
serialized by the SerializeJSON function into a JSON structure with
two arrays: an array column names, and an array of arrays,
where the outer array rows correspond to the query rows, and the
inner array entries correspond to the column fields in the row. --->
<!--- First, find the positions of the columns in the data array. --->
<cfset colList=ArrayToList(cfData.COLUMNS)>
<cfset cityIdx=ListFind(colList, "City")>
<cfset tempIdx=ListFind(colList, "Temp")>
<cfset fcstIdx=ListFind(colList, "Forecasts")>
<!--- Now iterate through the DATA array and display the data. --->
<cfoutput>
<cfloop index="i" from="1" to="#ArrayLen(cfData.DATA)#">
<h3>#cfData.DATA[i][cityIdx]#</h3>
Current Temperature: #cfData.DATA[i][tempIdx]#<br><br>
<b>Forecasts</b><br><br>
<cfloop index="j" from="1" to="#ArrayLen(cfData.DATA[i][fcstIdx])#">
<b>Day #j#</b><br>
Outlook: #cfData.DATA[i][fcstIdx][j].WEATHER#<br>
High: #cfData.DATA[i][fcstIdx][j].HIGH#<br>
Low: #cfData.DATA[i][fcstIdx][j].LOW#<br><br>
</cfloop>
</cfloop>
</cfoutput>
</cfif>