首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何像CSV那样将JSON数据导入MySQL

如何像CSV那样将JSON数据导入MySQL
EN

Stack Overflow用户
提问于 2022-03-21 16:13:49
回答 2查看 385关注 0票数 0

在导出数据期间,我可以在CSV和JSON格式之间进行选择。查看CSV,数据(包括列名)的排列方式与我想要导入MySQL数据库的方式完全相同。

CSV截图

我从网页中获得JSON,它存储在$data变量中。

代码语言:javascript
复制
<html>
    <body>
        <?php

          // Include Parsehub REST api wrapper 
          require_once __DIR__ . '/vendor/autoload.php';
          use Parsehub\Parsehub;
          $api_key = "XXX";
          $project_token = "XXX";
          

          $parsehub = new Parsehub($api_key);
          $data =  $parsehub->getLastReadyRunData($project_token);
          echo $data;

        ?>

    </body>
</html>

它的回波输出将返回JSON:https://pastebin.com/raw/AZt4gvsC

创建表:

代码语言:javascript
复制
CREATE TABLE `utakmice_1` (
  `utakmica_name` varchar(64) NOT NULL,
  `utakmica_url` varchar(256) NOT NULL,
  `utakmica_liga` varchar(64) NOT NULL,
  `utakmica_liga_url` varchar(256) NOT NULL,
  `utakmica_vreme` varchar(64) NOT NULL,
  `utakmica_datum` varchar(64) NOT NULL,
  `utakmica_kvote_kvota` decimal(10,2) NOT NULL,
  `utakmica_kvote_kladionica` varchar(63) NOT NULL,
  `utakmica_kvote_kladionica_url` varchar(256) NOT NULL,
  `utakmica_kvote_igra` varchar(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

以哪种方式可以插入所有的json数据?

EN

回答 2

Stack Overflow用户

发布于 2022-03-21 17:49:22

使用PHP,您需要:

使用解码将JSON数据转换为关联数组

代码语言:javascript
复制
$data = json_decode($jsondata, true);

处理该数组以获取需要在表中插入的数据。

代码语言:javascript
复制
$name = $data['utakmica']['name'];
$url = $data['utakmica']['age'];
etc

使用Insert查询插入到MySQL (这里使用米斯里,但可以使用PDO)

代码语言:javascript
复制
$sql = "INSERT INTO utakmice_1(utakmica_name, utakmica_url)
    VALUES('$name', '$url')";
if(!mysqli_query($con, $sql))
{
    die('Error : ' . mysql_error());
}
票数 0
EN

Stack Overflow用户

发布于 2022-03-22 00:41:55

给定CSV显示和JSON中的结构,当对JSON结构执行标准递归迭代时,通过修改终止leaf是不再包含数组属性的对象时,就可以遍历所有叶节点的属性名,其属性名以所有父属性名称(删除数组索引)为前缀,并使用所有较低深度的当前对象(来自子迭代器)进行深度升序,以便创建一个合并对象以获得具有这些键的对象。

它的样板是RecursiveArrayIteratorRecursiveIteratorIterator.

重要的是,如果一个对象有一个属性是一个数组,它是唯一的属性是一个数组,而这个数组是一个对象的数组,这些对象都是同构的。这是JSON文本的情况,这一点很重要,因为需要修改RecursiveArrayIteratorRecursiveIteratorIterator来进行这种遍历。

未经修改的样板行为也在相关的Q&A 如何使用PHP解析JSON文件?中显示。

代码语言:javascript
复制
$it = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($json)
);
foreach ($it as $property => $value) {
   ...
}

在用例中,这两个对象都需要修改,而且它只适用于只对叶进行迭代(因为只有在合并对象时才有意义),整个构造可以从RecursiveIteratorIterator,覆盖直接接受$json的构造函数扩展,使用RecursiveArrayIterator.的修改。

说到这里,它需要保留键前缀(此处实现为私有属性),将对象转换为不可遍历的子对象(标准行为是每个非对象和非数组属性构造一个叶),并从每个节点中删除数组属性,因为这些属性只用于遍历叶节点,然后在整个路径上按深度升序合并时,它们将是多余的:

代码语言:javascript
复制
$it = new class ($json) extends \RecursiveIteratorIterator {
    public function __construct(object $json)
    {
        $jsonObjectRecursion = new class($json) extends \RecursiveArrayIterator
        {
            private ?string $keyPrefix = null;

            public function key()
            {
                return (null !== $this->keyPrefix ? $this->keyPrefix . '_' : '') . parent::key();
            }

            public function current(): object|array
            {
                $current = parent::current();
                if (is_array($current)) {
                    return $current;
                }

                $current = array_filter(get_object_vars($current), static fn ($any) => !is_array($any));
                if (null !== $this->keyPrefix) {
                    $current = array_combine(preg_filter('/^/', "{$this->keyPrefix}_", array_keys($current)), $current);
                }
                return (object)$current;
            }

            public function hasChildren(): bool
            {
                $current = parent::current();
                if (is_array($current)) {
                    return parent::hasChildren();
                }
                return (is_object($current) && array_filter(get_object_vars($current), 'is_array'));
            }

            public function getChildren(): self
            {
                $current = parent::current();
                if (is_array($current)) {
                    $children = parent::getChildren();
                    $children->keyPrefix = $this->key();
                    return $children;
                }

                $probe = array_filter(get_object_vars($current), 'is_array');
                $children = new self((object) [key($probe) => current($probe)]);
                $children->keyPrefix = $this->keyPrefix;
                return $children;
            }
        };

        parent::__construct($jsonObjectRecursion);
    }
    ...

如本节选所示,数组遍历被保留,密钥前缀也随之传递。也许可以删除current()中的数组处理,因为数组只有在has/getChildren()调用时才能起作用。

$json只是一个大的JSON对象,它被解码为PHP的stdClass。尽管RecursiveArrayIterator的名称中包含数组,但它可以很好地处理这些JSON对象,而无需将它们转换为数组。

在仅定义内部迭代器的构造函数旁边,此RecursiveIteratorITerator只实现第二个方法current(),它执行合并:

代码语言:javascript
复制
    ...

    public function current(): object
    {
        $object = [];
        for ($depth = 0; $depth <= $this->getDepth(); $depth++) {
            $current = $this->getSubIterator($depth)->current();
            if (is_array($current)) {
                continue;
            }
            $object += get_object_vars($current);
        }
        return (object)$object;
    }
};

正如现在定义的$it一样,所需要的就是遍历它并继续执行以下值:

代码语言:javascript
复制
foreach ($it as $row) {
    echo json_encode($row, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), "\n";
    break;
}

输出(第一行):

代码语言:javascript
复制
{
    "utakmica_name": "Deportivo Kuenka-Un. Katolika Kito",
    "utakmica_url": "https://www.fudbal91.com/soccer_clubs/compare/Deportivo_Cuenca_vs_Un._Catolica_Quito/13641",
    "utakmica_liga": "Ekvador 1",
    "utakmica_liga_url": "https://www.fudbal91.com/competition/Ecuador,_LigaPro_betcris_-_Primera_Etapa/2022",
    "utakmica_vreme": "00:00",
    "utakmica_datum": "< 22.03.2022. (Utorak) >",
    "utakmica_kvote_kvota": "2.75",
    "utakmica_kvote_kladionica": "BetOle",
    "utakmica_kvote_kladionica_url": "https://example.com/2YjM4Ft",
    "utakmica_kvote_igra": "1"
}

若要将$it转换为对象数组,请使用iterator_to_array($it, false)。当您期待按照一个属性对整个列表进行排序时,不需要每次操作都需要遍历整棵树。

就像--如果你已经使用了CSV导出,那么它已经是平坦的了。

这样的,甚至更多的提示可以在相关的Q&A 如何使用PHP从JSON中提取和访问数据?和更多的其他网站上找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71560704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档