JSON 记录转换为 CSV 格式是现代 PHP 应用程序中报告和数据交换的常见需求。Aspose.BarCode Cloud SDK for PHP 提供了强大的 API,可直接从服务器生成条形码图像并处理文件转换。在本教程中,您将看到一个完整的 PHP JSON 转 CSV 代码示例,该示例还为每条记录嵌入条形码图像。我们将逐步演示设置、实现步骤、cURL 替代方案以及性能最佳实践。

如何在 PHP 中将 JSON 数据转换为 CSV - 步骤指南

  1. 通过 Composer 安装 SDK:使用官方 Composer 包将库添加到您的项目中。
composer require aspose-barcode-cloud
  1. 配置 API 凭证并创建 BarCodeApi 实例:将 YOUR_APP_SIDYOUR_APP_KEY 替换为您的云凭证。
use Aspose\BarCode\Cloud\Configuration;
use Aspose\BarCode\Cloud\BarCodeApi;

$appSid = 'YOUR_APP_SID';
$appKey = 'YOUR_APP_KEY';
$config = new Configuration($appSid, $appKey);
$apiInstance = new BarCodeApi($config);

参考文献: BarCodeApi class. 3. 打开源 JSON 文件和目标 CSV 文件:脚本使用文件流以保持低内存使用。

$inputHandle  = fopen($inputJsonPath, 'rb');
$outputHandle = fopen($outputCsvPath, 'wb');
  1. 遍历 JSON 记录,生成条形码并写入 CSV 行:每条记录的 id 字段会被转换为条形码图像,进行 base64 编码后添加到 CSV 中。
while (($line = fgets($inputHandle)) !== false) {
    $record = json_decode(trim($line), true);
    $barcodeValue = $record['id'] ?? '';
    $barcodeRequest = new GenerateBarcodeRequest([
        'type'   => $barcodeFormat,
        'text'   => (string)$barcodeValue,
        'format' => 'PNG',
        'resolutionX' => 300,
        'resolutionY' => 300
    ]);
    $barcodeResponse = $apiInstance->generateBarcode($barcodeRequest);
    $record['barcode_image'] = base64_encode($barcodeResponse);
    // Write header once, then rows
    // ...
}
  1. 清理临时文件并关闭流:处理完成后会删除临时文件夹。
fclose($inputHandle);
fclose($outputHandle);
array_map('unlink', glob($barcodeTempDir . '/*.png'));
rmdir($barcodeTempDir);

在 PHP 中从 JSON 生成 CSV 输出 - 完整代码示例

以下示例演示了使用 Aspose.BarCode Cloud SDK for PHP 读取 JSON 文件、创建条形码图像并将数据写入 CSV 文件的完整实现。

<?php
declare(strict_types=1);

// Autoload Composer dependencies (Aspose.BarCode Cloud SDK)
require __DIR__ . '/vendor/autoload.php';

use Aspose\BarCode\Cloud\Configuration;
use Aspose\BarCode\Cloud\BarCodeApi;
use Aspose\BarCode\Cloud\Model\GenerateBarcodeRequest;

// -------------------- Configuration --------------------
$appSid = 'YOUR_APP_SID';
$appKey = 'YOUR_APP_KEY';
$config = new Configuration($appSid, $appKey);
$apiInstance = new BarCodeApi($config);

// -------------------- Settings --------------------
$inputJsonPath   = __DIR__ . '/data/input.json';   // JSON source (one object per line)
$outputCsvPath   = __DIR__ . '/data/output.csv';   // Resulting CSV
$delimiter       = ';';                           // Custom CSV delimiter
$encoding        = 'UTF-8';                       // Target CSV encoding
$barcodeFormat   = 'Code128';                     // Barcode symbology
$barcodeField    = 'id';                          // JSON field to turn into barcode
$barcodeTempDir  = __DIR__ . '/temp_barcodes';    // Temporary folder for barcode images

// Ensure temporary directory exists
if (!is_dir($barcodeTempDir)) {
    mkdir($barcodeTempDir, 0777, true);
}

// -------------------- Open Files --------------------
$inputHandle  = fopen($inputJsonPath, 'rb');
if ($inputHandle === false) {
    throw new RuntimeException("Unable to open input JSON file.");
}
$outputHandle = fopen($outputCsvPath, 'wb');
if ($outputHandle === false) {
    fclose($inputHandle);
    throw new RuntimeException("Unable to open output CSV file.");
}

// Write UTF-8 BOM for Excel compatibility
fwrite($outputHandle, "\xEF\xBB\xBF");

// -------------------- Process JSON --------------------
$headerWritten = false;
while (($line = fgets($inputHandle)) !== false) {
    $line = trim($line);
    if ($line === '' || $line === '[' || $line === ']') {
        continue; // skip empty lines or array brackets
    }
    // Remove trailing commas if present (common in pretty‑printed arrays)
    $line = rtrim($line, ',');
    $record = json_decode($line, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        continue; // skip malformed lines
    }

// Generate barcode image for the selected field
    $barcodeValue = $record[$barcodeField] ?? '';
    $barcodeRequest = new GenerateBarcodeRequest([
        'type' => $barcodeFormat,
        'text' => (string)$barcodeValue,
        'format' => 'PNG',
        'resolutionX' => 300,
        'resolutionY' => 300
    ]);
    try {
        $barcodeResponse = $apiInstance->generateBarcode($barcodeRequest);
        $barcodeFilePath = $barcodeTempDir . '/' . uniqid('barcode_', true) . '.png';
        file_put_contents($barcodeFilePath, $barcodeResponse);
        // Store relative path (or base64) in CSV; here we use base64 to keep CSV self‑contained
        $barcodeBase64 = base64_encode($barcodeResponse);
        $record['barcode_image'] = $barcodeBase64;
    } catch (Exception $e) {
        $record['barcode_image'] = '';
    }

// Prepare CSV row with proper UTF‑8 encoding
    $csvRow = [];
    foreach ($record as $value) {
        if (is_array($value) || is_object($value)) {
            $value = json_encode($value, JSON_UNESCAPED_UNICODE);
        }
        $csvRow[] = mb_convert_encoding((string)$value, $encoding, 'UTF-8');
    }

// Write header once
    if (!$headerWritten) {
        $header = array_keys($record);
        fputcsv($outputHandle, $header, $delimiter);
        $headerWritten = true;
    }

// Write data row
    fputcsv($outputHandle, $csvRow, $delimiter);
}

// -------------------- Cleanup --------------------
fclose($inputHandle);
fclose($outputHandle);

// Optionally delete temporary barcode files
array_map('unlink', glob($barcodeTempDir . '/*.png'));
rmdir($barcodeTempDir);

注意: 此代码示例演示了核心功能。在将其用于项目之前,请确保更新文件路径(input.jsonoutput.csv 等)以匹配实际文件位置,验证所有必需的依赖项已正确安装,并在开发环境中彻底测试。如遇到任何问题,请参阅官方文档或联系支持团队获取帮助。

使用 cURL 通过 REST API 从 JSON 创建 CSV

您可以直接调用 Aspose.BarCode Cloud REST 端点,而无需编写 PHP 代码,即可实现相同的结果。工作流程包括上传 JSON 文件、为每条记录生成条形码以及下载最终的 CSV。

  1. 获取访问令牌(用您的凭据替换占位符)。
curl -X POST "https://api.aspose.cloud/connect/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET"

响应中包含 access_token

  1. 上传源 JSON 文件
curl -X PUT "https://api.aspose.cloud/v3.0/barcode/storage/file/input.json" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -H "Content-Type: application/json" \
     --data-binary @data/input.json
  1. 为单个记录生成条形码(在脚本中对每条记录重复)
curl -X POST "https://api.aspose.cloud/v3.0/barcode/generate" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
           "type":"Code128",
           "text":"12345",
           "format":"PNG",
           "resolutionX":300,
           "resolutionY":300
         }' \
     -o temp/barcode_12345.png
  1. 组装 CSV 文件(您可以使用一个简单的脚本读取上传的 JSON,插入 base64 编码的条形码,并写入 CSV)。
    组装步骤在本地执行;API 并未提供直接的 JSON 转 CSV 端点。

  2. 下载生成的 CSV.

curl -X GET "https://api.aspose.cloud/v3.0/barcode/storage/file/output.csv" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -o data/output.csv

有关参数的完整列表,请参阅官方 API 文档

环境准备

要开始编码,您需要 PHP 运行时(7.4 或更高)以及有效的 Aspose.BarCode Cloud 帐户。

composer require aspose-barcode-cloud

从官方发布页面下载 SDK 包: Aspose.BarCode Cloud SDK for PHP Download。安装后,创建一个包含您的 APP_SIDAPP_KEYconfig.php 文件。

优化大型 JSON 处理性能

  1. 流式处理 JSON 文件 - 按行读取,而不是将整个文件加载到内存中。
  2. 重用 BarCodeApi 实例 - 为每条记录创建新客户端会增加开销。
  3. 限制条码分辨率 - 300 dpi 对大多数报告已足够;较低的值可减小负载大小。
  4. 批量写入 CSV 行 - 在调用 fputcsv 之前缓冲几行,以最小化磁盘 I/O。

高效 JSON 转 CSV 转换的实用技巧

  • 当数据可能包含逗号时,使用分号 (;) 或制表符 (\t) 作为分隔符。
  • 使用 UTF‑8 编码非 ASCII 字符,并在前面添加 BOM (\xEF\xBB\xBF) 以兼容 Excel。
  • 将条形码图像以 Base64 字符串形式存储在 CSV 中,以保持文件自包含。
  • 每次运行后清理临时条形码文件夹,防止磁盘杂乱。
  • 使用 json_last_error() 验证 JSON 行,以优雅地跳过格式错误的记录。

结论

本指南带您通过在 PHP 中使用 Aspose.BarCode Cloud SDK for PHP 的完整 JSON 转 CSV 示例代码。您学习了如何配置 SDK、为每条记录生成条形码、处理自定义分隔符和 UTF‑8 编码,以及针对大数据集的性能优化。该 SDK 是商业产品;您可以购买生产使用的许可证,或从临时许可证页面获取临时许可证以评估该库。立即开始集成代码,简化您的数据交换管道。

常见问题

Q: PHP 中的 JSON 转 CSV 示例代码如何处理嵌套对象?
A: 在写入 CSV 之前,嵌套的数组或对象会使用 json_encode 转换为 JSON 字符串,从而保持 CSV 的扁平结构,同时保留原始数据。更多详情,请参阅 Aspose.BarCode Cloud SDK for PHP documentation

Q: 我可以在 PHP 的 JSON 转 CSV 脚本中更改 CSV 分隔符吗?
A: 可以,在脚本顶部修改 $delimiter 变量(例如,将其设置为 ',' 以使用逗号分隔的文件)。该脚本会尊重您提供的任何单字符分隔符。

Q: 有办法高效处理成千上万条 JSON 记录吗?
A: 当然可以。教程的性能章节建议对输入文件进行流式处理,复用 API 客户端,并批量写入行。这些技术可以降低内存使用并加快大 JSON 文件的处理速度。

Q: JSON转CSV实用程序在PHP中是否支持其他条形码格式?
A: $barcodeFormat 变量可以设置为 Aspose.BarCode 支持的任何符号,例如 QRDataMatrixCode39。只需在运行脚本之前更新该值。

Read More