我在这里有点麻烦。我正在使用Web上的库中存在的相同jsonEncode函数(例如http://cflib.org/udf/jsonencode)。这些编码方法使用java.lang.StringBuffer创建json数据,而不使用CF因臭名昭着的太多内存。但是,如果我想将json值中的所有键小写,这些值恰好也是要转换为json的结构元素,则整个过程会中断。它涉及以下内容:
<cfelseif IsStruct(_data)>
<cfset dJSONString = createObject('java','java.lang.StringBuffer').init("") />
<cfset arKeys = StructKeyArray(_data) />
<cfloop from="1" to="#ArrayLen(arKeys)#" index="i">
<!--- Null Checks --->
<cfif NOT structKeyExists(_data, arKeys[i])>
<cfset tempVal = "null">
<cfelse>
<!--- Get Encoded Value --->
<cfset tempVal = jsonEncode(
_data[ arKeys[i] ],
arguments.queryFormat,
arguments.queryKeyCase,
arguments.stringNumbers,
arguments.formatDates,
arguments.columnListFormat,
arguments.keyCase
) />
</cfif>
<!--- Key to lower Case? --->
<cfset arKey = arKeys[i] />
<cfif Len(arKey) and arguments.keyCase neq "none">
<cfif arguments.keyCase EQ "lower">
<cfset arKey = LCASE(arKey) />
<cfelse>
<cfset arKey = UCASE(arKey) />
</cfif>
</cfif>
<cfif dJSONString.toString() EQ "">
<cfset dJSONString.append('"' & arKey & '":' & tempVal) />
<cfelse>
<cfset dJSONString.append("," & '"' & arKey & '":' & tempVal) />
</cfif>
</cfloop>
<cfreturn "{" & dJSONString.toString() & "}" />
如果我只是简单地为arKey [i]赋值arKey而没有任何操作,那么脚本运行正常。但是,当我将键大写或小写并将其重新调回arKey变量时,该过程就会爆炸。
为什么?在CF中的lcase或ucase函数中是否存在java.lang.StringBuffer发现不兼容的东西?如果我需要继续使用StringBuffer方法,还有哪种方法可以创建这些json数据字符串而不会严重影响内存?