keboola-legacy/json-parser

此包已被弃用且不再维护。作者建议使用 keboola/json-parser 包。

Keboola JSON转CSV解析器

3.0.0 2021-01-15 15:41 UTC

README

描述

解析JSON字符串到CSV文件。如果JSON包含编号数组,则从单个JSON创建多个表格。使用Keboola\CsvFile进行结果处理

使用方法

    use Keboola\Json\Parser;
	$parser = Parser::create(new \Monolog\Logger('json-parser'));
	$file = file_get_contents("some/data.json");
	$json = json_decode($file);

	$parser->process($json);

	$results = $parser->getCsvFiles(); // array of CsvFile objects

解析器\Json

分析并解析JSON数据到n*CSV文件。

create(\Monolog\Logger $logger, $struct, $analyzeRows)

  • $struct应该包含一个数组,其中包含来自之前analyze()调用的结果(由process()自动调用)
  • $analyzeRows确定要分析的数据行数(仅计算每个JSON的"根"级别)[默认-1为无限]

process($data, $type, $parentId)

  • 期望将结果数组作为$data参数
  • $type用于命名结果表
  • $parentId可以是字符串,它将被保存在JSON_parentId列中,或是一个包含"column_name" => "value"的数组,它将使用数组键命名列
  • 检查数据是否需要分析,并分析或解析到$this->tables[$type]中($type根据SAPI命名要求进行优化)
  • 如果数据已分析,则存储在缓存中,并且**不解析**,直到调用$this->getCsvFiles()为止

getCsvFiles()

  • 返回包含解析结果的\Common\Table对象列表

解析特性

analyze函数遍历数组的每一行(通常是一个结果数组),并将行传递到analyzeRow()方法。如果行仅包含字符串,则将其存储在"data"列中,否则行通常应该是对象,因此对象的所有变量将用作列名,并对其值进行分析

  • 如果是标量,它将保存为该列的值。
  • 如果是另一个对象,它将递归地解析到analyzeRow()中,其变量名将添加到当前对象的名称前
    • 例如:"parent": {"child" : "value1"} 将结果为一个 "parent_child" 列,其字符串类型为 "value1"
  • 如果是数组,它将被传递到analyze()以创建一个新表,通过JSON_parentId链接