針對新浪微博開放平台返回的巢狀 JSON 格式,需提取 retweeted_status 物件中的 user_id 與 text,轉碼 UTF-8 中文後存入 MySQL。完整流程包含:讀取檔案 → 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; }
}
}
\u4e24\u6735... 轉為字串 兩棵小花呀...,無需手動處理。addBatch() + executeBatch() 大幅提升入庫速度,並配合 setAutoCommit(false) 手動控制事務。utf8mb4,連線字串含 characterEncoding=utf8,確保 Emoji 等補充字元正常存儲。JsonParser 流式讀取,避免一次性載入記憶體。此範例涵蓋讀取、解析、轉碼、入庫全流程,可直接適配生產環境定時同步任務。