### 技术博客:设计小型网站接收JSON数据并插入数据库表



背景介绍

随着数据的快速增长,我们逐渐需要将动态数据存储到数据库中。通过此项目,我们将实现接收用户输入的JSON数据,并将其解析为数据库表,同时具备数据验证功能。本项目结合了网络请求与文件处理的核心概念,帮助学习者掌握数据解析、验证和数据库交互的关键技术。


思路分析

本项目的核心逻辑如下:

  1. 数据读取与验证:从本地文件或网络中读取JSON数据,验证数据格式是否符合预期。
  2. 网络请求:建立HTTP请求,将验证后的数据发送至后端服务或数据库,实现数据插入。
  3. 数据库插入:将验证通过的数据插入到数据库表中,支持简单的插入逻辑。

代码实现

Python 示例(网络请求与数据库插入)
import json
import requests

# 1. 读取JSON文件
def load_json_file(file_path):
    try:
        with open(file_path, "r") as f:
            data = json.load(f)
        return data
    except Exception as e:
        raise ValueError("读取JSON文件时出错: {}".format(e)) 

# 2. 数据验证逻辑
def validate_json(json_data):
    if not isinstance(json_data, dict):
        raise ValueError("输入非字典类型")

    required_fields = ['name', 'age', 'email']
    for field in required_fields:
        if not field in json_data:
            raise ValueError(f"缺少必需字段: {field}")

    # 检查年龄类型是否为整数
    if not isinstance(json_data['age'], int):
        raise ValueError("年龄必须是整数")

    # 检查邮箱是否符合格式
    if not re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$', json_data['email']):
        raise ValueError("邮箱格式不合法")

def insert_data(db_connection, data):
    # 假设数据库表名为 users
    sql_query = """
        INSERT INTO users (name, age, email)
        VALUES (%s, %s, %s)
    """
    values = (data['name'], data['age'], data['email'])
    db_connection.execute(sql_query, values)

# 3. 网络请求示例
def send_request(url, data):
    try:
        response = requests.post(url, json=data)
        return response.json()
    except Exception as e:
        raise ValueError(f"请求失败: {e}")

# 示例运行流程
if __name__ == "__main__":
    database_url = "sqlite:///db.sqlite"
    file_path = "input.json"

    # 读取并验证数据
    json_data = load_json_file(file_path)
    validate_json(json_data)

    # 假设数据库连接以 SQLite 为例
    conn = sqlite3.connect(database_url)
    insert_data(conn, json_data)

    # 输出数据库插入记录
    print("数据库表中插入记录:")
    print("INSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com');")

    # 关闭连接
    conn.close()
Java 示例(网络请求与数据库插入)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;

// 1. 读取JSON文件
public class DataReader {

    public static String readJson(String filePath) throws IOException {
        return Files.readAllLines(Files.open(new File(filePath))).collect(Collectors.joining(", "));
    }

    // 2. 数据验证逻辑
    public static void validateJson(String jsonStr) throws IOException {
        try {
            String json = new FileReader(new File(filePath)).readAllLines().join(",");
            if (!jsonStr.equals(json)) {
                throw new IllegalArgumentException("JSON格式不匹配");
            }
        } catch (Exception e) {
            throw new IllegalArgumentException("读取JSON文件时出错: " + e.getMessage());
        }
    }

    // 3. 网络请求示例
    public static void connectToDatabase(String dbUrl) {
        try {
            URL url = new URL(dbUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");

            System.out.println("请求成功,响应内容如下: ");
            System.out.println(conn.getResponseCode());
            System.out.println(conn.getResponseLines());

        } catch (Exception e) {
            System.err.println("网络请求失败: " + e.getMessage());
        }
    }

    // 4. 数据库插入示例
    public static void insertIntoDatabase(String table) {
        System.out.println("插入到数据库表: " + table);
    }

    // 示例运行流程
    public static void main(String[] args) {
        String dbUrl = "jdbc:mysql://localhost:3306/mydb";
        String filePath = "input.json";

        try {
            String jsonStr = readJson(filePath);
            validateJson(jsonStr);

            // 1. 数据库连接
            ConnectionPool dbConnection = new ConnectionPool();
            insertIntoDatabase("users");

            // 2. 网络请求
            connectToDatabase(dbUrl);

        } catch (Exception e) {
            System.err.println("错误信息: " + e.getMessage());
        }
    }

总结

本项目的核心知识点包括:

  1. 文件读取与数据结构处理:使用Python的json模块读取JSON数据。
  2. 常见数据验证逻辑:验证JSON格式、字段存在性及数据类型。
  3. 网络请求调用机制:通过HTTP请求发送数据并处理响应。

该项目要求1-3天完成,涉及基础网络知识和数据处理技术。该项目不仅展示了编程实践,也体现了如何将数据处理与数据库操作结合开发。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注