有人在从 ColdFusion 的 serializeJSON 方法到 PHP 的 json_decode 时遇到问题吗?

Anyone have issues going from ColdFusion's serializeJSON method to PHP's json_decode?

提问人:Andrew Hedges 提问时间:10/1/2008 最后编辑:Programmer BruceAndrew Hedges 更新时间:6/18/2011 访问量:2178

问:

Interwebs 对此无济于事。我们在 ColdFusion 中使用 Data 进行编码,并尝试在 PHP 中使用 .大多数情况下,这工作正常,但在某些情况下,返回 .我们已经找到了明显的罪魁祸首,但似乎正在按预期格式化。还有什么问题?serializeJSONjson_decodejson_decodeNULLserializeJSON

更新:有几个人(明智地)要求我发布导致问题的输出。我会的,只是我们刚刚发现结果集是我们的所有数据(列出 2300+ 出租物业的信息,总共 565,135 个 ASCII 字符)!这可能是一个问题,尽管我在 PHP 文档中没有看到任何关于字符串最大大小的内容。那里的限制因素是什么?公羊?

更新二:看起来问题在于我们的几个用户复制并粘贴了带有“智能”引号的Microsoft Word文本。那些讨厌的用户......

php coldfusion json

评论

0赞 modius 10/1/2008
您是否有解码为 NULL 的 JSON 输出示例?
0赞 Till 10/1/2008
这是一个很好的问题/问题。你有运气解决它吗?我记得这些引号总是杀手锏——例如,尝试以 Flash 形式输出它们。我想我们使用 MB 来修复编码,然后它起作用了,但我不记得了。
0赞 Ben Doom 10/2/2008
cflib.org 有一个很棒的“demoronizer”UDF,用于清除 Word 插入的随机内容。
0赞 Stewart Robinson 7/26/2009
我相信您可以轻松清理数据。请参阅我的答案,其中包括解决此问题的 CF 方法和 PHP 方法。
0赞 Henry 7/28/2009
与其剥离它们,不如以某种方式将它们编码成 unicode JSON 字符串吗?

答:

1赞 Owen 10/1/2008 #1

你能可靠地复制这个问题吗?如果是这样,您可以发布返回 null 的示例数据吗?我相信你知道这一点,但为了给其他可能不知道的人提供信息,RFC 4627 描述了 JSON,假设有效的 javascript 是有效的 JSON 是一个常见的错误。最好将 JSON 视为 javascript 的子集。

作为对编辑的回应:

我建议检查以确保您的信息被填充到您的 PHP 脚本中(在它被传递给json_decode之前),并验证该信息(特别是如果您可以可靠地重现错误)。为方便起见,您可以尝试使用在线验证器。根据非常有限的信息,听起来也许它超时了,没有抓取所有数据?需要这么大的数据集吗?

0赞 John Millikin 10/1/2008 #2

你可以尝试用另一个解析器来解析它,并寻找一个错误——我知道 Python 的 JSON 解析器质量非常高。如果您安装了 Python,则很容易通过 demjson 的语法检查器运行文本。如果它是一个非常大的数据集,你可以使用我的库 jsonlib - 内存使用率会高于 demjson,但它会运行得更快,因为它是用 C 语言编写的。

2赞 Ates Goral 10/5/2008 #3

您可以尝试在 UTF-8 中操作,并让 PHP 知道这一事实。

我遇到了PHP无法解码UTF-8 JSON字符串的问题(除了您拥有的大括号之外,还有一些“奇怪”的字符)。我的解决方案是通过在向 PHP 提交的 HTML 页面中插入一个 Content-Type 元标记来暗示 PHP 我正在以 UTF-8 模式工作。这样,提交数据的内容类型(即 JSON 字符串)也将是 UTF-8:json_decode

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

在那之后,PHP能够正确地解码字符串。json_decode

1赞 Stewart Robinson 7/26/2009 #4

我遇到了这个确切的问题,事实证明这是由于 ColdFusion 没有将任何可打印字符放入 JSON 数据包中(这些字符确实存在于我们的数据中),但它们无法进入 JSON。

这个网站上的两个问题为我解决了这个问题,尽管我选择了PHP解决方案而不是ColdFusion解决方案,因为我觉得它是两者中更优雅的。

PHP解决方案

在将字符串传递给 json_decode() 之前修复它

$string = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);

ColdFusion 解决方案

使用 serializeJSON() 后,在该 SO 问题中使用 cleanXmlString() 函数