Struct 如何在Coldfusion中从结构中删除键/值对?

Struct 如何在Coldfusion中从结构中删除键/值对?,struct,coldfusion,key-value,Struct,Coldfusion,Key Value,(使用Coldfusion8/MySQL5.0.88) 我正在数据库中存储JSON字符串。字符串由一个id(键)和列表中的许多项(值)组成 值如下所示: LOCAL.dropRecall = {"994323":"596895,596871,596864,596888,596840abc,596833,596826","991234":"9999,8888,abced"} <cfif StructKeyExists(LOCAL.dropRecall,"#Session.id#")>

(使用Coldfusion8/MySQL5.0.88)

我正在数据库中存储JSON字符串。字符串由一个
id
(键)和列表中的许多
项(值)组成

值如下所示:

LOCAL.dropRecall = {"994323":"596895,596871,596864,596888,596840abc,596833,596826","991234":"9999,8888,abced"}
<cfif  StructKeyExists(LOCAL.dropRecall,"#Session.id#")>
   <cfdump output="e:\dump.txt" label="catch" var="detected">
   <cfset StructDelete( LOCAL.dropRecall,"#Session.id#", "true")>
</cfif>
我的问题是试图删除
键/值
对。我试着这样做:

LOCAL.dropRecall = {"994323":"596895,596871,596864,596888,596840abc,596833,596826","991234":"9999,8888,abced"}
<cfif  StructKeyExists(LOCAL.dropRecall,"#Session.id#")>
   <cfdump output="e:\dump.txt" label="catch" var="detected">
   <cfset StructDelete( LOCAL.dropRecall,"#Session.id#", "true")>
</cfif>

它正确地检测到密钥/值对(
检测到的
已报告),但删除它不起作用

问题:
我做错了什么?为什么不删除键/值对

编辑

好啊找到了。我在数据库中查询字段
,将其设置为
LOCAL.dropRecall
,并将
写回数据库。。。因此,
structDelete
有效,但我没有将空结构写回数据库。

我想知道问题是
LOCAL.dropRecall
中的变量名是否以数字开头?ColdFusion变量应始终以字母、下划线或Unicode货币符号开头。

检查
session.id
的值是否与您认为的值相同(没有额外的空格或类似内容)。如果您的代码在CF8上,我尝试了修改,它对我来说很好:

<cfset variables.id = 991234>
<cfset LOCAL.dropRecall = deserializeJson('{"994323":"596895,596871,596864,596888,596840abc,596833,596826","991234":"9999,8888,abced"}')>
<cfset LOCAL.safeCopy = duplicate(LOCAL.dropRecall)> 

<cfif  StructKeyExists(LOCAL.dropRecall,"#variables.id#")>
    <cfset StructDelete( LOCAL.dropRecall,"#variables.id#", "true")>
</cfif>
<cfdump var="#LOCAL#">


该代码对您不起作用吗?

Adam针对ColdFusion 2016的解决方案的更新版本

<cfscript>
   variables.id = 991234;
   LOCAL.dropRecall = deserializeJson('{"994323":"596895,596871,596864,596888,596840abc,596833,596826","991234":"9999,8888,abced"}');
   LOCAL.safeCopy = duplicate(LOCAL.dropRecall);

   LOCAL.dropRecall.delete(variables.id); // you don't have to test if it is there

   writedump(LOCAL);
</cfscript>

variables.id=991234;
LOCAL.dropRecall=deserializeJson(“{”994323:“59689559687159686459686888596840abc,596833596826”,“991234:“999999888,abced”}”);
LOCAL.safeCopy=重复(LOCAL.dropRecall);
LOCAL.dropRecall.delete(variables.id);//你不必测试它是否存在
书面文件(本地);

看起来不错。。。不需要引号或散列,也不需要structdelete的最后一个参数。如果在structdelete之后转储local.droprecall,您会得到什么?该代码对我来说运行良好,即它会删除一个现有密钥,如
994323
。那么你用什么测试来确定这个“不起作用”?@Leigh:啊。。。1秒。我认为这就是问题所在。重复Stuart的评论:
StructDelete(LOCAL.dropRecall,Session.id)
-做了完全相同的事情,噪音更小。不幸的是,LiveDocs代码示例通常写得不好。这在CF5之后就不是真的了。结构键(现在所有变量都是)可以有任何您喜欢的名称。只有使用点表示法,旧规则仍然有效,但使用关联数组表示法,一切都很好。没问题。转储结果仍然向我显示了问题所在(我没有用正确的值更新数据库)。谢谢你的帮助!