【问题标题】:Importing JSON into Mysql将 JSON 导入 Mysql
【发布时间】:2013-06-26 09:09:25
【问题描述】:

我面临的问题是将 JSON 导入 Mysql。我搜索了互联网,搜索了 stackoverflow 甚至可能更多的资源,但找不到单个 正确 解决方案。在这里全面披露——我不是 PHP、SQL,也不是 JSON 专业人士。

我想要完成的事情相当简单:导入这个 JSON 文件 https://developers.facebook.com/tools/explorer/method=GET&path=245226895508982%2Ffeed%3Faccess_token%3D%3Caccess_token%3E= 进入Mysql数据库。 我知道我需要以某种方式将 JSON 数据分配到列中,然后根据内容相应地管理行。我不需要所有数据,但需要大部分数据。稍后应通过用户的搜索查询回显数据。

我的问题似乎很简单——我该怎么做?

P.S:我尝试将其转换为 XML,但我没有足够的权限将 XML 导入 SQL 数据库。转换器也不是最好的工作。

【问题讨论】:

  • 到目前为止你有什么代码?你被困在哪里了?此任务涉及多个步骤,因此在不知道您的代码处于什么位置的情况下很难提供帮助。你已经设置了数据库吗?你知道如何读取 json 文件并用 php 解析它吗?您是否遇到数据库查询本身的问题?一旦你理解了所有这些事情,这个问题就相当简单了。如果你不这样做,那将不容易,需要一些学习。
  • 感觉就像您在尝试寻找解决方案而没有真正了解事情的运作方式。为什么在理解整个数据库之前尝试插入数据库?
  • @DanyCaissy 感谢您的快速回复。我了解数据库的基础知识-无论如何我对它们没有广泛的了解。到目前为止我有什么代码:我使用了这里提供的代码stackoverflow.com/questions/12165456/…,但这并没有让我走得太远。我在哪里卡住了:基本上如何解决这个问题——所以在一开始。我是否已经有数据库:是的。我知道如何读取 json 文件并用 php 解析它吗:可能不知道。
  • 好吧,您需要决定是否要为每个 JSON 属性使用不同的列,或者是否要将所有内容都放在同一列中。您必须决定要如何处理数据,我们无法为您做到。
  • 列应为 ID、NAME、MESSAGE

标签: php mysql json facebook import


【解决方案1】:

您可以将 json 导出为 csv:http://www.danmandle.com/blog/json-to-csv-conversion-utility/https://github.com/danmandle/JSON2CSV

然后:

LOAD DATA INFILE 'filepath/your_csv_file.csv' INTO TABLE tablename;

单打应该没问题。

load data infile 的更多信息。

【讨论】:

  • 谢谢!我也试过那个。这就是正在发生的事情:`
    警告:array_keys() [function.array-keys]:第一个参数应该是/home/mandledp/danmandle.com/projects/JSON2CSV/json2csv.class.php 中的数组 20

    警告:在 /home/mandledp/danmandle.com/projects/JSON2CSV/json2csv.class.php20 行 中为 foreach() 提供的参数无效
    ...我发现这是一个很好的解决方案json-csv.com/Default.aspx。但是,他们向您收取 4 美元的副本费用,这显然是不可行的。
  • 向我们展示您的 JSON 文件的第一行。
  • { "id": "245226895508982_585115708186764", "from": { "name": "Ma Mei", "id": "100005547752625" }, "to": { "data": [ { "name": "Wohnung/WG in München gesucht!", "id": "245226895508982" } ] }, "message": "Hallo,\n\nsuchen eine 3 oder 4 Zimmer Wohnung", "privacy": { "value": "" }, "type": "status", "created_time": "2013-06-26T21:44:27+0000", "updated_time": "2013-06-26T21:44:27+0000" }
  • 好的,所以我认为有了这个JSON文件,在你的数据库中插入数据并不容易。它不是 cell{key1:value1, key2:value2} 的数组。您必须提取、转换然后加载您的数据 ==> 检查谷歌的 ETL 是否可以帮助您(pentaho 是一个免费的 ETL 工具)
  • JSON2CSV 因错误而失败:“JSON 无效或具有嵌套元素。”,但它只是一个带有键值的普通平面 JSON 对象。我发现 excel(用于 Office 365)也可以将 JSON 转换为 CSV。我按照建议运行了命令,但发现该文件必须在目录SHOW VARIABLES LIKE "secure_file_priv"; 中。最后,该文件不应该是逗号分隔的,而是制表符分隔的(有些用户报告甚至用分号分隔)。
【解决方案2】:

就像其他人所说的那样,您必须进行一些转换才能完成您的要求。幸运的是,让 PHP 遍历数据并为您完成大部分工作并不难。这是一个快速而肮脏的尝试:

// MySQL table's name
$tableName = 'my_table';
// Get JSON file and decode contents into PHP arrays/values
$jsonFile = '/path/to/file.json';
$jsonData = json_decode(file_get_contents($jsonFile), true);

// Iterate through JSON and build INSERT statements
foreach ($jsonData as $id=>$row) {
    $insertPairs = array();
    foreach ($row as $key=>$val) {
        $insertPairs[addslashes($key)] = addslashes($val);
    }
    $insertKeys = '`' . implode('`,`', array_keys($insertPairs)) . '`';
    $insertVals = '"' . implode('","', array_values($insertPairs)) . '"';

    echo "INSERT INTO `{$tableName}` ({$insertKeys}) VALUES ({$insertVals});" . "\n";
}

这将输出一系列 INSERT INTO my_table (...) VALUES (...); SQL 语句,您可以将它们保存到 . sql 文件并导入 MySQL。使用这种方法,每个 INSERT 可以有不同的列而不会引起问题。

注意:addslashes() 不是一种非常安全的方法,最好使用 real_escape_string() 之类的方法,但如果您的 JSON 数据是可信赖的,则此方法无需数据库连接即可工作。

【讨论】:

  • 将此添加到您的代码中,它将为空值空 $insertVals = str_replace("''", 'NULL', $insertVals);
【解决方案3】:

使用MySQL Shell 8.0.13,您可以使用util.importJson shell API 函数或命令行选项--import 将 JSON 文档直接导入 MySQL 服务器。例如从文件导入:

mysqlsh user@host:port/database --import /tmp/facebook.json collection_name

或将 JSON 文档通过管道传输到标准输入:

cat /tmp/facebook.json | mysqlsh user@host:port/database --import - collection_name

其中collection_namecollection

有关 MySQL Shell 的 JSON 导入实用程序的更多信息:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-json.html

更多关于文档存储:https://dev.mysql.com/doc/refman/8.0/en/document-store.html

有关文档和集合的更多信息:https://dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-collections.html

【讨论】:

    【解决方案4】:

    以下内容已在 MySQL 8.0.18 上测试并运行。我希望它适用于任何支持 JSON 数据类型和加载数据语句的版本。

    可以从任何 SQL 客户端使用 load data 语句加载 JSON 文件。假设用户具有运行该语句的适当权限和对该文件的适当访问权限。

    create table jsonTableName( jsonColumnName json );
    
    load data infile '/var/lib/mysql-files/someFile.json'
      into table jsonTableName
      fields terminated by '\0' escaped by ''
      lines terminated by '\0';
    

    Fields以 '\0' 终止的行 禁用字段和行解析,因此假定整个文件是单个单元格。

    escaped by '' 禁用 \ 被加载程序解释。因此允许 \" 直接发送到 JSON 解析器。没有它,任何转义序列都将被错误地加载,可能导致异常。

    当 JSON 文件位于本地计算机上而 MySQL 服务器不在时(用于远程传输),请使用 load data LOCAL infile(如@Vijay 建议的那样)。请记住,local 仅在服务器和您的客户端都已配置为允许时才有效。使用 select @@local_infile; 检查服务器设置(0 表示不允许,1 表示允许)。对于 MySQL Workbench 客户端,在 Connection -> Advanced -> Others 中添加 OPT_LOCAL_INFILE=1。对于 IntelliJ/Datagrip 客户端,在高级连接设置中将 allowLoadLocalInfile 设置为 true

    【讨论】:

    • 这有效并有助于将数据存储为 json 数据类型列...命令必须以 LOAD DATA LOCAL INFILE 开头
    • 你是对的,@Vijay。虽然测试 JSON 文件与 MySQL 服务器在同一台机器上,因此不需要 local。此外,本地是一个相当混乱的选择,有许多潜在的陷阱,这让我想远离它。虽然这是一个非常有用的选项,但我添加了一个包含更多信息的段落。
    【解决方案5】:

    我知道这是一个旧帖子,但也许它可以帮助某人。 我想在 mysql 中创建与 mongoDb 中相同的数据库。

    我有一个包含数据(不是结构)的有效json文件,然后我在mysql中创建了一个具有适当结构的表(根据json数据),并通过MySql工作台导入。

    Here 是 csv 的示例,但您可以加载 json 文件。 只需按照向导将数据导入表并确保结构有效,否则将不会导入任何内容。

    【讨论】:

      【解决方案6】:

      我是从 Youtube 上看到从 json 导入 MySQL 的视频中得到这个想法的。 Json_import_into_MySQL。因此,您可以使用 MySQL Workbench 将 json 文件导入到表中。

      1. 创建一个包含转储文件数据列的表。

      更新

      不必事先创建表。 Workbench 将从转储文件中创建它。

      1. 打开工作台
      2. 选择左侧的架构选项卡。 (我在 Ubuntu 上使用 MySQL Workbench 8.0) 如果侧边栏不可见,则从视图 -> 面板 -> 显示侧边栏显示它。

      仅当您想填充已经存在的表时

      1. 选择要在其中导入转储文件的架构 -> 表。
      2. 右键单击要导入的表。
      3. 然后选择表数据导入向导。(从上数第 5 个)。

      1. 单击或粘贴您要导入的文件的 url。记得把csv改成json格式;在右下角。

      如果没有选择表。请输入表名,否则 wrokbench 将使用转储文件名作为表名。

      1. Workbench 会自动将列头与表格字段进行协调。
      2. 点击完成以完成导入。

      请记住将列类型更改为相关的;因为 Workbench 将默认使用 TEXT。首先找到字段中字符的最大长度,然后更改它。

      例如。

      SELECT 
        max(length(province)) `province`,  
        max(length(cnic)) `cnic`,  
        max(length(`name`)) `name`,  
        max(length(district)) `district`,  
        max(length(fatherName)) `fatherName`
      from tab1;
      
      ALTER TABLE tab1
        CHANGE province province CHAR(16), 
        CHANGE cnic cnic CHAR(20), 
        CHANGE `name` `name` CHAR(70), 
        CHANGE district district CHAR(34), 
        CHANGE fatherName fatherName CHAR(43);
      

      【讨论】:

        猜你喜欢
        • 2016-10-22
        • 2011-01-30
        • 1970-01-01
        • 2019-09-19
        • 2014-05-23
        • 2015-06-05
        • 2020-12-07
        • 2018-11-26
        • 2017-08-25
        相关资源
        最近更新 更多