Java怎么调用接口获取json数据解析后保存到数据库

发布时间:2023-05-06 11:37:09 作者:iii
来源:亿速云 阅读:503

Java怎么调用接口获取json数据解析后保存到数据库

在现代的软件开发中,Java 作为一种广泛使用的编程语言,经常被用于处理各种数据交互任务。其中,调用接口获取 JSON 数据并解析后保存到数据库是一个常见的需求。本文将详细介绍如何使用 Java 实现这一过程,涵盖从接口调用、JSON 数据解析到数据库操作的全流程。

目录

  1. 准备工作
  2. 调用接口获取 JSON 数据
  3. 解析 JSON 数据
  4. 保存数据到数据库
  5. 完整代码示例
  6. 总结

准备工作

在开始编写代码之前,我们需要确保开发环境已经准备好。以下是所需的工具和库:

添加依赖

如果使用 Maven 进行依赖管理,可以在 pom.xml 文件中添加以下依赖:

<dependencies>
    <!-- Jackson for JSON parsing -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.0</version>
    </dependency>

    <!-- Apache HttpClient for HTTP requests -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>

    <!-- MySQL Connector for database connection -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
</dependencies>

调用接口获取 JSON 数据

在 Java 中,我们可以使用多种方式发送 HTTP 请求来调用接口并获取 JSON 数据。这里我们以 Apache HttpClient 为例,展示如何发送 GET 请求并获取响应。

使用 Apache HttpClient 发送 GET 请求

首先,我们需要创建一个 HttpClient 实例,然后构建一个 HttpGet 请求,并执行该请求以获取响应。

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

public class HttpClientExample {
    public static void main(String[] args) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet request = new HttpGet("https://api.example.com/data");

        try (CloseableHttpResponse response = httpClient.execute(request)) {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                String result = EntityUtils.toString(entity);
                System.out.println(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

处理响应

在上面的代码中,我们通过 EntityUtils.toString(entity) 将响应实体转换为字符串。这个字符串通常是 JSON 格式的数据,接下来我们需要解析它。

解析 JSON 数据

Java 中有多种方式可以解析 JSON 数据,常用的库包括 JacksonGson。这里我们以 Jackson 为例,展示如何将 JSON 字符串解析为 Java 对象。

使用 Jackson 解析 JSON

假设我们有一个 JSON 数据如下:

{
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@example.com"
}

我们可以定义一个对应的 Java 类:

public class User {
    private int id;
    private String name;
    private String email;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

然后,我们可以使用 Jackson 将 JSON 字符串解析为 User 对象:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonParsingExample {
    public static void main(String[] args) {
        String json = "{\"id\":1,\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"}";

        ObjectMapper objectMapper = new ObjectMapper();
        try {
            User user = objectMapper.readValue(json, User.class);
            System.out.println("ID: " + user.getId());
            System.out.println("Name: " + user.getName());
            System.out.println("Email: " + user.getEmail());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

处理复杂的 JSON 结构

如果 JSON 数据结构较为复杂,例如包含嵌套对象或数组,我们可以通过定义相应的 Java 类结构来解析它。

例如,假设我们有如下 JSON 数据:

{
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@example.com",
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA",
        "zip": "12345"
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "555-555-5555"
        },
        {
            "type": "work",
            "number": "555-555-1234"
        }
    ]
}

我们可以定义以下 Java 类:

public class Address {
    private String street;
    private String city;
    private String state;
    private String zip;

    // Getters and Setters
}

public class PhoneNumber {
    private String type;
    private String number;

    // Getters and Setters
}

public class User {
    private int id;
    private String name;
    private String email;
    private Address address;
    private List<PhoneNumber> phoneNumbers;

    // Getters and Setters
}

然后,使用 Jackson 解析:

import com.fasterxml.jackson.databind.ObjectMapper;

public class ComplexJsonParsingExample {
    public static void main(String[] args) {
        String json = "{\"id\":1,\"name\":\"John Doe\",\"email\":\"john.doe@example.com\",\"address\":{\"street\":\"123 Main St\",\"city\":\"Anytown\",\"state\":\"CA\",\"zip\":\"12345\"},\"phoneNumbers\":[{\"type\":\"home\",\"number\":\"555-555-5555\"},{\"type\":\"work\",\"number\":\"555-555-1234\"}]}";

        ObjectMapper objectMapper = new ObjectMapper();
        try {
            User user = objectMapper.readValue(json, User.class);
            System.out.println("ID: " + user.getId());
            System.out.println("Name: " + user.getName());
            System.out.println("Email: " + user.getEmail());
            System.out.println("Address: " + user.getAddress().getStreet() + ", " + user.getAddress().getCity());
            for (PhoneNumber phoneNumber : user.getPhoneNumbers()) {
                System.out.println("Phone: " + phoneNumber.getType() + " - " + phoneNumber.getNumber());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

保存数据到数据库

在解析 JSON 数据后,我们需要将数据保存到数据库中。这里我们以 MySQL 数据库为例,展示如何使用 JDBC 进行数据库操作。

配置数据库连接

首先,我们需要配置数据库连接信息。通常,这些信息包括数据库 URL、用户名和密码。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {
    private static final String URL = "jdbc:mysql://localhost:3306/mydatabase";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

插入数据到数据库

接下来,我们可以编写代码将解析后的数据插入到数据库中。假设我们有一个 users 表,表结构如下:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

我们可以编写如下代码将 User 对象插入到 users 表中:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DatabaseInsertExample {
    public static void main(String[] args) {
        User user = new User();
        user.setId(1);
        user.setName("John Doe");
        user.setEmail("john.doe@example.com");

        String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, user.getId());
            pstmt.setString(2, user.getName());
            pstmt.setString(3, user.getEmail());

            int rowsInserted = pstmt.executeUpdate();
            if (rowsInserted > 0) {
                System.out.println("A new user was inserted successfully!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

处理复杂数据结构的插入

如果数据结构较为复杂,例如包含嵌套对象或数组,我们需要分别处理这些数据。例如,假设我们有一个 users 表和 phone_numbers 表,表结构如下:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

CREATE TABLE phone_numbers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    type VARCHAR(50),
    number VARCHAR(20),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

我们可以编写如下代码将 User 对象及其关联的 PhoneNumber 对象插入到数据库中:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ComplexDatabaseInsertExample {
    public static void main(String[] args) {
        User user = new User();
        user.setId(1);
        user.setName("John Doe");
        user.setEmail("john.doe@example.com");

        PhoneNumber homePhone = new PhoneNumber();
        homePhone.setType("home");
        homePhone.setNumber("555-555-5555");

        PhoneNumber workPhone = new PhoneNumber();
        workPhone.setType("work");
        workPhone.setNumber("555-555-1234");

        user.setPhoneNumbers(Arrays.asList(homePhone, workPhone));

        String userSql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
        String phoneSql = "INSERT INTO phone_numbers (user_id, type, number) VALUES (?, ?, ?)";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement userPstmt = conn.prepareStatement(userSql);
             PreparedStatement phonePstmt = conn.prepareStatement(phoneSql)) {

            // Insert user
            userPstmt.setInt(1, user.getId());
            userPstmt.setString(2, user.getName());
            userPstmt.setString(3, user.getEmail());
            int userRowsInserted = userPstmt.executeUpdate();
            if (userRowsInserted > 0) {
                System.out.println("A new user was inserted successfully!");
            }

            // Insert phone numbers
            for (PhoneNumber phoneNumber : user.getPhoneNumbers()) {
                phonePstmt.setInt(1, user.getId());
                phonePstmt.setString(2, phoneNumber.getType());
                phonePstmt.setString(3, phoneNumber.getNumber());
                int phoneRowsInserted = phonePstmt.executeUpdate();
                if (phoneRowsInserted > 0) {
                    System.out.println("A new phone number was inserted successfully!");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

完整代码示例

以下是一个完整的示例,展示了如何从接口获取 JSON 数据、解析数据并保存到数据库。

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Step 1: Call API to get JSON data
        String json = callApi("https://api.example.com/data");

        // Step 2: Parse JSON data
        User user = parseJson(json);

        // Step 3: Save data to database
        saveToDatabase(user);
    }

    private static String callApi(String url) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet request = new HttpGet(url);

        try (CloseableHttpResponse response = httpClient.execute(request)) {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                return EntityUtils.toString(entity);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static User parseJson(String json) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.readValue(json, User.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static void saveToDatabase(User user) {
        String userSql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
        String phoneSql = "INSERT INTO phone_numbers (user_id, type, number) VALUES (?, ?, ?)";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement userPstmt = conn.prepareStatement(userSql);
             PreparedStatement phonePstmt = conn.prepareStatement(phoneSql)) {

            // Insert user
            userPstmt.setInt(1, user.getId());
            userPstmt.setString(2, user.getName());
            userPstmt.setString(3, user.getEmail());
            int userRowsInserted = userPstmt.executeUpdate();
            if (userRowsInserted > 0) {
                System.out.println("A new user was inserted successfully!");
            }

            // Insert phone numbers
            for (PhoneNumber phoneNumber : user.getPhoneNumbers()) {
                phonePstmt.setInt(1, user.getId());
                phonePstmt.setString(2, phoneNumber.getType());
                phonePstmt.setString(3, phoneNumber.getNumber());
                int phoneRowsInserted = phonePstmt.executeUpdate();
                if (phoneRowsInserted > 0) {
                    System.out.println("A new phone number was inserted successfully!");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

class DatabaseConnection {
    private static final String URL = "jdbc:mysql://localhost:3306/mydatabase";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

class User {
    private int id;
    private String name;
    private String email;
    private Address address;
    private List<PhoneNumber> phoneNumbers;

    // Getters and Setters
}

class Address {
    private String street;
    private String city;
    private String state;
    private String zip;

    // Getters and Setters
}

class PhoneNumber {
    private String type;
    private String number;

    // Getters and Setters
}

总结

本文详细介绍了如何使用 Java 调用接口获取 JSON 数据、解析 JSON 数据并保存到数据库的全过程。通过使用 Apache HttpClient 发送 HTTP 请求、Jackson 解析 JSON 数据以及 JDBC 进行数据库操作,我们可以轻松地实现这一常见的开发任务。

在实际开发中,可能会遇到更多的复杂情况,例如处理 API 认证、处理大量数据、优化数据库操作等。希望本文的内容能够为读者提供一个坚实的基础,帮助大家更好地应对这些挑战。

推荐阅读:
  1. Java中String类的使用方法有哪些
  2. Java怎么实现图形界面计算器

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java 数据库 json

上一篇:Java怎么生成exe可执行文件

下一篇:java8 stream排序及自定义比较器的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》