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

Php 如何正确地转义CSV列中JSON对象中嵌套的字符串中的双引号?,php,json,csv,escaping,fgetcsv,Php,Json,Csv,Escaping,Fgetcsv,我有一个用例,客户需要通过CSV导入加载JSON序列化对象。其中一些对象包含包含双引号的字符串。通常我只是在嵌套的双引号之前添加一个“\”来转义它,但是这似乎与CSV文件的解析冲突。我们使用PHP7.0和函数“fgetcsv”来读取文件的行。每当我这样做的时候,我都会注意到在遇到转义双引号后的奇怪行为。以下是CSV中的一个示例行: "{""test"": ""\""this\"" is a test""}" 下面是PHP如何使用fgetcsv阅读本专栏: {"test": "\"this\""

我有一个用例,客户需要通过CSV导入加载JSON序列化对象。其中一些对象包含包含双引号的字符串。通常我只是在嵌套的双引号之前添加一个“\”来转义它,但是这似乎与CSV文件的解析冲突。我们使用PHP7.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\”:\“\\\”这是一个测试\“}”

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


或者,如果您使用的是
fgetcsv
5.3或更高版本,您可以尝试更改
fgetcsv
参数,以更改封闭字符或转义字符,使其不会与JSON冲突。请参阅中的参数

附件 可选机柜参数设置字段机柜字符(仅一个字符)。

退出 可选的转义参数设置转义字符(仅一个字符)

注意:通常,附件字符在字段内通过加倍进行转义;但是,转义字符可以用作替代字符。因此,对于默认参数值,“和\”具有相同的含义。除了允许转义附件字符外,转义字符没有特殊意义;它甚至不是为了逃避自己


(原文强调)

您需要这些CSV被除
fgetcsv
以外的任何人读取吗?@NathanHinchey我想不出任何其他用例,因此我们可以将范围限制在fgetcsv。您能澄清所需的输出是什么吗?是不是
{“test”:“\“this\”是一个test”}
?(因此JSON中的
“this”
的评估值是
“this”是一个测试
)@NathanHinchey。为了清楚起见,我在问题中添加了这个。@NathanInchey不是一个打字错误。这个双引号存在于输出中。我确实在fgetcsv文档中看到了转义字符参数,但是理想情况下,解决方案只需要更改CSV文件本身,而不需要更改底层代码。这可能是不可能的,但如果是这样的话,那肯定是首选的解决方案。{“test\”:\“\\\\\\\\\”这是一个测试\“}也没有正确解析。它的解析方式与输入的完全相同:{\“test\”:\“\\\\”这是一个测试\“}。我使用的是PHP7.0。你用双引号括起来了吗?如果是这样,那就太奇怪了,我建议,咬紧牙关修改代码。“对不起”\_(ツ)_/“是的,的确很奇怪。谢谢你的推荐。