如何正确转义嵌套在位于 CSV 列中的 JSON 对象中的字符串中的双引号?

How do I properly escape double quotes in strings nested in a JSON object located in a CSV column?

我有一个用例,客户需要通过 CSV 导入加载 JSON 序列化对象。其中一些对象包含包含双引号的字符串。通常我会简单地在嵌套双引号之前添加一个 '\' 以将其转义,但这似乎与 CSV 文件的解析冲突。我们正在使用 PHP 7.0 和函数 "fgetcsv" 来读取文件的行。每当我这样做时,我都会在遇到转义双引号后注意到奇怪的行为。这是 CSV 中的示例行:

"{""test"": ""\""this\"" is a test""}"

下面是 PHP 使用 fgetcsv 读取此列的方式:

{"test": "\"this\"" is a test""}"

我已经确认了在初始转义双引号 运行 之后的任何双引号进入这个问题。认为反斜杠可能会导致转义问题我尝试使用另一个反斜杠来转义反斜杠:

"{""test"": ""\""this\"" is a test""}"

结果如下:

{"test": "\"this\" is a test"}

所以虽然这确实解决了第一个以外的任何双引号的问题,但我留下了两个反斜杠而不是一个。

在不更改底层代码的情况下,是否有办法转义此数据,以便 fgetcsv 正确解释它?像这样:

{"test": "\"this\" is a test"}

您可以尝试使用 \" 来表示双引号而不是 ""

例如,"{\"test\": \"\\"this\\" is a test\"}"

这是否有效可能取决于您使用的 fgetcsv 版本 -- 我不确定。


或者,如果您使用的是 fgetcsv 5.3 或更高版本,您可以尝试更改 fgetcsv 参数以更改封闭字符或转义字符,这样它就不会与 JSON。请参阅 the fgetcsv docs.

中的参数

enclosure

The optional enclosure parameter sets the field enclosure character (one character only).

escape

The optional escape parameter sets the escape character (one character only).

Note: Usually an enclosure character is escaped inside a field by doubling it; however, the escape character can be used as an alternative. So for the default parameter values "" and \" have the same meaning. Other than allowing to escape the enclosure character the escape character has no special meaning; it isn't even meant to escape itself.

(原文着重)