我正在尝试解析json文件并遇到this问题。我从查询中提取一些数据并将其转换为json,将其发送到另一个文件,然后解析它。但是,有些数据是一个空字符串,当我尝试解析它时会破坏它。
我目前正在生成json对象:
<cfset person = '{
"fname":"#ReReplace(firstName, '\t', '\\t', "all").trim()#",
"lname":"#ReReplace(lastName, '\t', '\\t', "all").trim()#",
"occupation":"ReReplace(lastName, '\t', '\\t', "all").trim()#"
}'>
我目前已经在使用replace来处理值中的选项卡(不要问,人们做奇怪的事情)并且想使用replace来处理空字符串。我尝试使用Replace(firstName, '', '""', "all")
但是冷却并不喜欢那一点,原因很明显。一个选择是在我进入json世代之前使用if语句,但是我想知道是否有人知道使用Replace
的更快方式?
答案 0 :(得分:8)
你永远不应该手工创建一个json字符串。
相反,您应该使用http://json.org提供的库或内置方法。最新版本的coldfusion有SerializeJSON和DeSerializeJSON,所以你应该使用它们。
<cfset person = {}>
<cfset person.fname = firstName.trim()>
<cfset person.lname = lastName.trim()>
<cfset person.occupation = occupation.trim()>
<cfset personJSON = SerializeJSON(person)>
这样做意味着您不必担心空字符串,标签或甚至引号。
可能需要注意的是,根据您的应用程序设置,您的键名称可能会更改为全部大写。在railo / lucee中,可通过设置全局应用程序设置或使用
来解决此问题<cfprocessingdirective preserveCase="true">
在ColdFusion 11+中,可以使用服务器或Application level setting来解决此问题。目前,这些设置仅适用于基本结构,而不适用于系统范围。
<cfset this.serialization.preserveCaseForStructKey = true>
对于ColdFusion 10及更早版本,必须使用longhand结构语法来保留大小写:
<cfset person = {}>
<cfset person["fname"] = "John">
<cfset person["lname"] = "Smith">
<cfset person["occupation"] = "Developer">
由于您提到了查询,ColdFusion 11还添加了一个新的序列化选项,它将查询对象转换为更标准的,Ajax友好格式:结构数组。新格式既可以在应用程序级别应用,也可以在每次使用的基础上应用,即serializeJSON(queryName, "struct")
。不幸的是,它们都没有保留查询列名称的情况。与query.columnList
一样,生成的密钥名称始终大写。