【问题标题】:Coldfusion SerializeJSON creating blank valuesColdfusion SerializeJSON 创建空白值
【发布时间】:2012-05-21 15:03:30
【问题描述】:

我正在尝试使用 SerializeJSON() 将 CFC 的实例转换为字符串,我可以将其存储在数据库中,然后稍后再拉出。

我遇到的问题是使用以下代码:

<cfdump var="#THIS#">

    <!--- Convert CFC to JSON --->
    <cfset thisJSON = SerializeJSON(THIS)>

    <cfdump var="#DeserializeJSON(thisJSON)#">

给我以下内容:

红色转储显示了 CFC,其中包含一个名为 controls 的数组,其中包含 7 个项目,每个项目都是另一个更简单的 CFC。当我运行serializeJSON,然后将结果通过deserializeJSON 传回后转储,项目 3 - 7 已成为空字符串。

这是 JSON:

{
    "MESSAGE":"",
    "CONTROLS":            
    [
        {
            "INDEX":"1.0",
            "NAME":"maxP11D",
            "SELWHERE":"",
            "DEF":"7940.0",
            "MMD":true,
            "ORDER":"7",
            "APP":"",
            "PRE":"",
            "MAXCAP":"35946.0",
            "FORMAT":"pound",
            "VALUE":"",
            "DESC":"List price exc FRF & VED",
            "MINCAP":"7939.0",
            "MINVAL":"7939.0",
            "MAXVAL":"35946.0",
            "TYPE":"range",
            "TITLE":"P11D"
        },            
        {
            "INDEX":"2.0",
            "NAME":"Y13Taxat22",
            "SELWHERE":"",
            "DEF":"0.0",
            "MMD":true,
            "ORDER":"6",
            "APP":" pa",
            "PRE":"Tax at 20%",
            "MAXCAP":"1904.1099853515625",
            "FORMAT":"pound",
            "DESC":"Personal tax rate",
            "VALUE":"",
            "MINVAL":"0",
            "MINCAP":"0.0",
            "MAXVAL":"1904.1099853515625",
            "TYPE":"range",
            "TITLE":"Company car tax"
        },
        "",
        "",
        "",
        "",
        ""
    ],
    "SELECTRESTRICT":"
        (taxtype<6)AND (t.Make=@Peugeot@)\r\nAND t.model NOT LIKE @%407%@\r\nAND
        t.model NOT LIKE @% old@\r\nAND t.model != @107 3 door@\r\nAND
        t.model != @107 5 door@\r\nORDER BY \r\nt.model = @%iOn%@ 
        DESC,\r\nt.model = @107 3 door New@ DESC,\r\nt.model = @107 5 door New@
        DESC,\r\nt.model LIKE @%207%@ DESC,\r\nt.model LIKE @%RCZ%@
        DESC,\r\nt.model LIKE @%308%@ DESC,\r\nt.model LIKE @%3008%@
        DESC,\r\nt.model LIKE @%4007%@ DESC,\r\nt.model = @508 Saloon@
        DESC,\r\nt.model = @508 SW@ DESC,\r\nt.model = @508 RXH@ 
        DESC,\r\nt.model LIKE @%5008%@ DESC,\r\nt.model LIKE @%807%@
        DESC,\r\nt.model LIKE @%Bipper%@ DESC,\r\nt.model LIKE @%Partner%@
        DESC,\r\nt.model ASC
    ",      
    "SHOWNOTES":true,
    "MYSQL": {         
        "WHERE":"",
        "COLS":"
            t.maxP11D, t.Y13Taxat22, t.Y13Taxat40, t.CO2gpkm,
            t.fuelConsumptionDf, t.bodyStyle, t.fuelType, 
        ",
        "EXCLUDE":""
    }
}

为什么前2项转换成功,其余5项变成字符串?

我很肯定这段代码曾经可以工作,我最近升级到 CF 9.0.1,还有其他人在 9.0.1 中遇到 JSON 问题吗?

【问题讨论】:

  • 我认为我们需要看到组件的模糊部分。我也认为也许做 #thisJSON# 可能会给你更多的线索。
  • 被模糊的部分只是组件的路径,如“path.to.component”,如var t = new path.to.component()。我做了一个#thisJSON#的转储,控件数组看起来像这样:"CONTROLS":[{...},{...},"","","","",""],所以你可以看到json字符串末尾的5个项目只是空白字符串
  • 所以没有特殊字符,没有下划线......只是blah + 。 + 废话 + 。 + blah() 对他们所有人都好吗?而且它们的形式看起来都一样?我想我正在寻找一些不标准的东西,解析器可能会阻塞或评估不正确。
  • 好的,我知道你现在有点意思了。我会将完整的转储添加到原始帖子中
  • 好的...数组中第三项的“NAME”属性是什么?

标签: json coldfusion coldfusion-9


【解决方案1】:

ACF 9 中的 serializeJSON 存在一些重大问题。请确保您已安装累积修补程序 2:

http://helpx.adobe.com/coldfusion/kb/cumulative-hot-fix-2-coldfusion-1.html

老实说,serializeJSON 是一个 POS。我一直在使用一个名为 CFJSON 的旧项目,并且没有任何问题。我建议只是切换到那个并忘记serializeJSON:

http://www.epiphantastic.com/cfjson/

【讨论】:

  • 嗯,关于那件事,我确信它在 CF9 时可以工作,在升级到 CF9.0.1 后,它就停止工作了。我想这支持您对 Hot Fix 的论点。我会试试的
  • 我相信这是一个 CF9 错误。安装 HF2 后我遇到了同样的问题。必须卸载 CF9,重新安装 CF9,更新到 CF901 并应用 HF1 来修复。似乎 HF1 是它实际工作的唯一版本。
  • Hotfix 2 确实解决了这个问题!我应用了修补程序 2,但我没有清除我的浏览器缓存,所以我在修补程序之前使用的带有不完整 JSON 的 cookie 仍然存在。我的缓存需要一段时间才能清除,但很明显,Coldfusion Hotfix 2 解决了这个问题!所有这些都正好赶上 Coldfusion 10 的发布。哦,好的,谢谢大家的帮助!
【解决方案2】:

您是否愿意使用 serializeJson(),或者 - 如果您所追求的只是序列化一个对象 - objectSave() 会是更好的选择吗?

【讨论】:

  • 它会进入数据库,所以使用 serializeJSON 创建一个字符串,再加上 deserializeJSON 让事情变得简单而简单。存储的序列化对象的 ID 保存在会话中,我想我可以只存储该对象保存到的文件的名称,尽管我想在不再需要文件时删除它们,这看起来像它会比 DB 方法更难做
  • 如果您不希望将对象保存为文件,为什么要将其保存到文件中?只需将其保存为二进制对象,将其转换为 base 64,将其存储为字符串。当再次需要它时,从数据库中读取它并使用 toBinary() 将其转换回二进制文件,并使用 objectLoad() 将其转换为对象。它比使用 JSON 有更多的步骤,但它的好处是使用正确的工具来完成预期的工作。另外它有效...如果您使用serializeJson() 序列化然后反序列化一个对象,那么您最终不会得到一个对象,而是一个结构。不是一回事。
  • 我试了一下,但它在 MySQL 数据库中被截断,然后我使用 objectLoad 得到 java.io.EOFException。我想我可能需要重新考虑这个 CFC 是如何构建的
  • 我想说这更多地与您的 DSN 配置或您的数据库架构有关,而不是序列化问题。我猜不是你特意说不是那样的。
  • 我尝试使用 MySQL longblob,但这似乎没有帮助。我将更详细地查看传入/传出数据库的字符串,看看它在什么时候被截断。
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多