2008/01/30

toJSONファンクションをバージョンアップ

toJSONファンクションをバージョンアップしました。
今までは、
Array[1] = "Apple"
Array[2] = "Lemon"
Array[3] = "Orange"
と配列の値が、文字列か数値しかJSON変換できなかったのですが、今回、1次元の配列の場合も変換できるようにしました。

例えば、
Array[1] = "Food"
Array[2] = Hoge["Apple","Lemon","Orange"]
Array[3] = "Banana"
という場合の配列があったならば、今回のプログラムの変更により、
var data = {
"0":"Food"
,"1":[{"1_1":"Apple","1_2":"Lemon","1_3":"Orange"}]
,"2":"Banana"
}
と変換できるようになりました。

ソースは次のような形で作りました。


< CFFUNCTION name="toJSON" >

<!--- declare arguments --->
<CFARGUMENT name="aArray" type="array" REQUIRED="yes">
<CFARGUMENT name="aScr" type="boolean" REQUIRED="no" default=true>
<CFARGUMENT name="aInd" type="numeric" REQUIRED="no" default=0>
<CFARGUMENT name="aName" type="string" REQUIRED="no" default="data">

<!--- declare variables --->
<CFSCRIPT>
var i = "";
var tmp = "";
var ind = "";
</CFSCRIPT>

<CFOUTPUT>
<!--- if aScr is true , make SCRIPT tag --->
<CFIF aScr EQ true>

<!--- make SCRIPT tag --->
<SCRIPT type="text/javascript">

</CFIF>
<CFSET ind = aInd>

<!--- output JSON --->
var #aName# = {

<!--- loop From 1 TO aArray'slength --->
<CFLOOP index="i" from="1" to="#ArrayLen(aArray)#">
<CFIF i NEQ 1>,</CFIF>"#ind#":
<!--- Is Array --->
<CFIF IsArray(aArray[#i#])>
[{
<CFLOOP index="k" from="1" to="#Evaluate("ArrayLen(aArray[#i#])")#">
<CFSET tmp = Evaluate("aArray[#i#][#k#]")>
<CFIF k NEQ 1>,</CFIF>"#i#_#k#":"#IIF(tmp NEQ "" , DE("#tmp#"), DE("null"))#"
</CFLOOP>
}]
<!--- Not Array --->
<CFELSE>
<CFSET tmp = Evaluate("aArray[#i#]")>
"#IIF(tmp NEQ "" , DE("#tmp#"), DE("null"))#"
</CFIF>

<CFSET ind = ind + 1>

</CFLOOP>

};

<!--- if aScr is true , make SCRIPT tag --->
<CFIF aScr EQ true>

<!--- make SCRIPT tag --->
</SCRIPT>

</CFIF>
</CFOUTPUT>

</CFFUNCTION>

このファンクションを通して、配列の値が、1次元配列でも、JSON変換できるようになりました。

さっそく、前回のプログラムをtoJSON_1.0.cfm、今回のファンクションをtoJSON_1.25としてアップロードしました。

0 コメント:

コメントを投稿