Coldfusion 11和Coldfusion 2016之间的编码问题

3

我目前在本地开发中使用 ColdFusion 11 作为服务器。

我有一个使用 ColdFusion 序列化的 JSON 字符串。在字符串中,我需要向对象 "Payment_form" 插入代码 "99"。API 要求响应中的 Payment_form 对象是一个字符串。

由于 ColdFusion 序列化与 JSON 字符串和数字表示存在问题,我在 StackOverflow 上找到了解决方案,即插入 "chr(2)"。

这个问题已经解决....但只在 ColdFusion 11 中解决。当我将代码上传到 ColdFusion 托管(hostek.com/CF2016)时,它停止工作,因为 chr(2) 返回值为 "/u000299",因此 API 响应出错。

我认为 ColdFusion 2016 更改了 chr() 的处理方式,但在两个版本的文档中都没有更改这个函数的处理方式。

看起来 CF/2016 根据 ASCII 表正在更改(转义 Unicode)。

ASCII 字符 2 的表示图像

  • 这是否与托管服务有关?
  • Hostek.com 是否具有不同的编码器与我的本地服务器不同?

希望有人能给出建议。谢谢。

<cfset requestData = {"customer": "#customer#"
        , "items":#empStruct#
        , "payment_form":"#chr(2)#99"
        , "payment_method": "#payment_method#"
        , "use": "#use#"
        , "folio_number": "#folio_number#"
        , "series": "#series#"
    }>

使用Coldfusion 11(本地服务器My_pc)对Exit Chain进行序列化

 {
  "payment_form": "99",
  "series": "F",
  "use": "G03",
  "customer": "5d965ab97419177948b59a26",
  "payment_method": "PPD",
  "items": [
    {
      "quantity": 2,
      "product": "5d9639d27419177948b59a0b"
    },
    {
      "quantity": 15,
      "product": "5d9639e07419177948b59a0c"
    }
  ],
  "folio_number": 7400
}

使用ColdFusion 2016(Coldfusion Hosting Hostek.com)对退出链进行序列化

 {
  "payment_form": "\\u000299",
  "series": "F",
  "use": "G03",
  "customer": "5d9691f17419177948b59a68",
  "payment_method": "PPD",
  "items": [
    {
      "quantity": 500,
      "product": "5d9d30bc08b8ad3f683e81bc"
    },
    {
      "quantity": 500,
      "product": "5d9d30c908b8ad3f683e81bd"
    }
  ],
  "folio_number": 7840
}
1个回答

1

TL;DR;

不要试图“修复修复”,而是尝试使用其中一个新的序列化特性

input = {"payment_form":"99"};
input.setMetadata( {payment_form: {type: "string"}} );
output = serializeJSON( input );

在开发和生产中使用不同的版本总是会导致问题……看看CommandBox,它可以非常容易地使用不同版本的CF。chr(2)返回值为“/u000299”。无论如何,serializeJSON()函数将chr(2)转换为/u0002。然而,这似乎并不是新行为。CF 11也是这样做的。与其试图“修复修复”,不如尝试使用新的序列化特性之一:Adobe ColdFusion(2016版)更新2使您能够为结构中的键指定数据类型信息。这被称为元数据。

明确声明payment_form值为字符串,CF将在引号中包含它,而不是猜测它是一个数字。

输入:

input = {"payment_form":"99"};
input.setMetadata( {payment_form: {type: "string"}} );
output = serializeJSON( input );
writeDump( output );

Results:

{"payment_form":"99"}

此外,如果您正在使用查询对象构建此内容,CF2016添加了两个新的应用程序设置,可以覆盖序列化查询的古怪默认值,从而使生成一个正确大小写的结构数组变得非常容易

1
我将你的示例应用到我的JSON链中,它完美地工作了!感谢你的建议。问候。 - Gabriel Villafuerte
很高兴能帮到你 :-) JSON处理仍然存在一些问题,但在CF2016+中有了很大的改善。 - SOS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接