首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 解析新浪微博 JSON 數據並入庫 MySQL 完整實作

     編輯:程式設計綜合問答

針對新浪微博開放平台返回的巢狀 JSON 格式,需提取 retweeted_status 物件中的 user_id 與 text,轉碼 UTF-8 中文後存入 MySQL。完整流程包含:讀取檔案 → JSON 解析 → 實體映射 → 批次入庫。

JSON 結構分析

{
  "reposts_count": 0,
  "user_id": 1620302927,
  "retweeted_status": {
    "reposts_count": 1,
    "user_id": 2209251457,
    "text": "\u4e24\u6735\u5c0f\u83ca\u82b1\u554a,\u5f00\u5728\u82b1\u4e1b\u4e2d\u554a"
  }
}

目標:提取 retweeted_status.user_id、retweeted_status.text(Unicode 轉中文)。

依賴選擇

推薦 Jackson(高效、Spring Boot 預設)或 Gson。此處用 json-simple(輕量、無依賴)示範核心邏輯。

<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

完整工具類

import org.json.simple.*;
import org.json.simple.parser.*;
import java.io.*;
import java.util.*;
import java.sql.*;

public class WeiboJsonToMysql {
    // 資料庫配置
    private static final String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
    private static final String DB_USER = "root";
    private static final String DB_PASS = "123456";
    
    public static void main(String[] args) throws Exception {
        String jsonContent = readFile("D:/weibo_data.txt"); // 檔案為 JSON 陣列 [{},{},...]
        List records = parseJsonArray(jsonContent);
        batchInsert(records);
        System.out.println("完成,共入庫 " + records.size() + " 筆");
    }
    
    static String readFile(String path) throws IOException {
        StringBuilder sb = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = br.readLine()) != null) sb.append(line);
        }
        return sb.toString();
    }
    
    static List parseJsonArray(String json) throws ParseException {
        List list = new ArrayList<>();
        JSONArray array = (JSONArray) new JSONParser().parse(json);
        for (Object obj : array) {
            JSONObject root = (JSONObject) obj;
            JSONObject retweet = (JSONObject) root.get("retweeted_status");
            if (retweet == null) continue;
            
            Long uid = (Long) retweet.get("user_id");
            String text = (String) retweet.get("text"); // json-simple 自動處理 Unicode 轉義
            if (uid != null && text != null) {
                list.add(new WeiboRecord(uid, text));
            }
        }
        return list;
    }
    
    static void batchInsert(List list) throws SQLException {
        String sql = "INSERT INTO retweetedWeibo (uid, text) VALUES (?, ?)";
        try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
             PreparedStatement ps = conn.prepareStatement(sql)) {
            conn.setAutoCommit(false);
            for (WeiboRecord r : list) {
                ps.setLong(1, r.uid);
                ps.setString(2, r.text);
                ps.addBatch();
            }
            ps.executeBatch();
            conn.commit();
        }
    }
    
    static class WeiboRecord {
        long uid; String text;
        WeiboRecord(long uid, String text) { this.uid = uid; this.text = text; }
    }
}

關鍵點提示

  • Unicode 自動轉碼:Jackson/Gson/json-simple 解析時會自動將 \u4e24\u6735... 轉為字串 兩棵小花呀...,無需手動處理。
  • 批次提交:addBatch() + executeBatch() 大幅提升入庫速度,並配合 setAutoCommit(false) 手動控制事務。
  • 資料庫編碼:表/欄位字元集設為 utf8mb4,連線字串含 characterEncoding=utf8,確保 Emoji 等補充字元正常存儲。
  • 大檔案流式解析:若檔案超大(GB 級),改用 Jackson JsonParser 流式讀取,避免一次性載入記憶體。

此範例涵蓋讀取、解析、轉碼、入庫全流程,可直接適配生產環境定時同步任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved