ColdFusionのオブジェクトをJSONに変換するコンポーネント

Ajaxなどを使っていると、JavaScript側ではJSONでデータを受け取りたいと思うことがあります。ColdFusionにはJSON形式で書き出してくれるための関数がなかったので、コンポーネントとして作りました。

CFOpen.org:Project Info- JSON serializer からダウンロードできます。

使い方は以下の通り。

<cfset aStruct = StructNew()>
<cfset aStruct['a'] = 'b'>
<cfset aStruct['b'] = 1>
<cfset aStruct['c'] = true>
<cfset aStruct['d'] = ArrayNew(1)>
<cfset aStruct['d'][1] = 'a'>
<cfset aStruct['d'][2] = 2>
<cfset aStruct['d'][3] = false>
<cfset aStruct['d'][4] = '"' & Chr(47) & Chr(165) & Chr(8) & Chr(12) & Chr(10) & Chr(13) & Chr(9)>
<cfset aStruct['e'] = CreateDateTime(2006, 4, 19, 20, 02, 30)>
<cfinvoke component="JSONSerializer" method="toJSON" obj="#aStruct#" returnvariable="aJson">
<cfoutput>#aJson#</cfoutput><br />

<cfset aAry = ArrayNew(1)>
<cfset aAry[1] = 123>
<cfset aAry[2] = 'str'>
<cfset aAry[3] = false>
<cfinvoke component="JSONSerializer" method="toJSON" obj="#aAry#" returnvariable="aJson">
<cfoutput>#aJson#</cfoutput><br />

<cfset aQry = QueryNew("name, address, phone")>
<cfset newRow = QueryAddRow(aQry, 2)>
<cfset temp = QuerySetCell(aQry, "name", 'Fred', 1)>
<cfset temp = QuerySetCell(aQry, "address", "9 Any Lane", 1)>
<cfset temp = QuerySetCell(aQry, "phone", "555-1212", 1)>
<cfset temp = QuerySetCell(aQry, "name", "Jane", 2)>
<cfset temp = QuerySetCell(aQry, "address", "14 My Street", 2)>
<cfset temp = QuerySetCell(aQry, "phone", "555-1444", 2)>
<cfinvoke component="JSONSerializer" method="toJSON" obj="#aQry#" returnvariable="aJson">
<cfoutput>#aJson#</cfoutput><br />

追記 2006年4月20日 15:31

UDFで同じようにJSONに変換してくれるjsonencode()と言うのを見つけました(See also: CFJSON)。だいたいですが、jsonencode()の方が2倍ぐらい早く動きます(とは言っても1回の呼び出しコストは、単純な構造体をJSONに変換するに2msとかぐらいですが)。

JSON serializer では内部的に<cfset>を使っているのですが、jsonencode()は<cfscript>を使って高速化を図っているようです。

JSONからColdFusionのオブジェクトに変換してくれるjsondecode()もあるようなので、あわせてどうぞ。

One thought on “ColdFusionのオブジェクトをJSONに変換するコンポーネント”

Leave a Reply

Your email address will not be published. Required fields are marked *