【问题标题】:How to find out why json_encode is failing (PHP)?如何找出 json_encode 失败的原因(PHP)?
【发布时间】:2020-07-13 15:32:36
【问题描述】:

我有一个包含姓名和日期列表的巨大 csv。我需要将其中的一个子集放入给定月份的 PHP 结构中。因此,我运行 CSV 并过滤那些我想要月份的行,将名称提交到列表,然后使用 json_encode 将该列表保存到文件中。

我每个月都这样做一次,总共 12 次,因为我只需要一年。

我从第 1 个月到第 7 个月没有问题。现在第 8 个月失败了。列表已生成,但没有存储任何内容,因为 json_encode 失败。

调用 json_last_error_msg() 会提供消息 Malformed UTF-8 characters。

我通过这样做来阅读 CSV

  if (($handle = fopen($in_csv, "r")) !== FALSE) {
       while (($data = fgetcsv($handle, 0, ",")) !== FALSE) {           
           $line++;
           
           $data = array_map("utf8_encode", $data);  // <- This was added after the first failure. But I have tried without it

           // ... do stuff with data and save the name and last name to a struct. 
           
       }       
       fclose($handle);
   }

   // At the end I do
   $fid = fopen("filename","w");
   fwrite($fid,json_encode($output));
   echo "JSON ENCODE RESULT: " . json_last_error_msg() . "\n";
   fclose($fid);

我真的需要这个来工作。 JSON 有什么方法可以告诉我它不喜欢什么,以便我可以删除或更正它?

【问题讨论】:

  • 你有什么错误吗?根据the docs,您可以通过将选项作为第二个参数传递给PHP 来告诉JSON_THROW_ON_ERROR,然后找出编码失败的原因。
  • 一个疯狂的猜测是你需要做 [mb_convert_encoding] (php.net/manual/en/function.mb-convert-encoding.php) 你可以尝试做一些事情mb_convert_encoding($string, 'UTF-8', 'UTF-8');西里尔语言通常是这种情况
  • 我们无法复制问题,因为我们什么都不知道。始终包含错误以及当它不起作用时变量所包含的内容。
  • @JimWright 是的,失败的原因是“格式错误的 UTF-8 字符”问题中的原因。但是我不知道哪些应该是畸形的,我不知道如何修复它。
  • @Andreas 问题出在问题上,正如我所说,该变量由超过 500 个名称的文本字符串组成。我应该如何提供变量内容?

标签: php json


【解决方案1】:

此错误通常是由于在这种情况下的数据编码不正确(UTF-8 编码)。检查数据中的所有语法,特别是检查逗号,,因为您有一个 CSV 文件。

根据PHP Manualjson_last_error_msg() 会抛出这种类型的错误。

JSON_ERROR_UTF8:格式错误的 UTF-8 字符,可能编码不正确

如果您在大型 csv 文件中手动查找错误时遇到问题。您可以使用这些库之一。

https://www.npmjs.com/package/csv-validator

https://www.npmjs.com/package/csv-file-validator

【讨论】:

  • 我知道,这是错误,但我不知道它在哪里。来自 CSV 的 o 行的这个子集大约有 1000 行,我不能只是手动搜索 1000 行以查找有错误的 1。这就是为什么我要尝试获取可能表明哪个是格式错误的字符的原因
  • 如果我用完了选项,我会检查一下。我没有安装,也没有使用过 npm。不过谢谢你的建议。你一直很善良
  • 很高兴帮助你@aarelovich,如果这对你有帮助,请记住接受这个作为答案?
  • 在我的情况下似乎没有什么用处,因为它会根据我不希望它们是什么而不是基于不正确的编码来验证字段
  • 嗯好的@aarelovich
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 2011-09-11
  • 2017-05-15
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多