ColdFusion CFC函数序列化数组格式异常,求修复方案
问题分析
你当前代码的核心问题是:将每个语言对应的月份字符串(带引号和逗号)作为单个元素添加到数组中,导致arrData最终是仅含一个元素的数组。序列化后自然会把这个长字符串作为数组的唯一元素,出现格式错误。
解决方案
方案一:正确构建数组(推荐)
直接将月份作为数组的独立元素添加,无需额外字符串处理,序列化后直接得到符合要求的JSON格式。同时修正英文二月的拼写错误(Febuary→February):
<cffunction name="getLocaleMonths"> <cfargument name="sLanguage" required="true" default="1"> <cfset arrData = []> <cfswitch expression="#sLanguage#"> <!-- 合并相同语言的case,简化代码 --> <cfcase value="10,6"> <cfset arrData = ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]> </cfcase> <cfcase value="13"> <cfset arrData = ["siječanj", "veljača", "ožujak", "travanj", "svibanj", "lipanj", "srpanj", "kolovoz", "rujan", "listopad", "studeni", "prosinac"]> </cfcase> <cfcase value="1"> <cfset arrData = ["January","February","March","April","May","June","July","August","September","October","November","December"]> </cfcase> </cfswitch> <cfreturn serializeJSON(arrData)> </cffunction>
方案二:正则替换临时修复(不推荐)
如果必须保留原有的字符串添加方式,可通过正则替换将数组内的单个字符串元素拆分为独立的JSON元素:
<cffunction name="getLocaleMonths"> <cfargument name="sLanguage" required="true" default="1"> <cfset arrData = []> <cfswitch expression="#sLanguage#"> <cfcase value="10"> <cfset arrayAppend(arrData,'"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"')> </cfcase> <cfcase value="6"> <cfset arrayAppend(arrData,'"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"')> </cfcase> <cfcase value="13"> <cfset arrayAppend(arrData,'"siječanj", "veljača", "ožujak", "travanj", "svibanj", "lipanj", "srpanj", "kolovoz", "rujan", "listopad", "studeni", "prosinac"')> </cfcase> <cfcase value="1"> <cfset arrayAppend(arrData,'"January","February","March","April","May","June","July","August","September","October","November","December"')> </cfcase> </cfswitch> <!-- 正则替换拆分单个元素为多个JSON元素 --> <cfset results = REReplace(serializeJSON(arrData), '\["([^"]+(?:",\s?"[^"]+)*)"\]', '["$1"]', 'all')> <cfreturn results> </cffunction>
正则逻辑:匹配数组内的单个字符串元素,将其中的逗号分隔月份转换为独立的JSON数组元素。
内容的提问来源于stack exchange,提问作者SweetTooth
相关产品推荐
相关产品推荐

