JSON (JavaScript Object Notation) = JavaScript 物件標記法。
1.是一種資料交換格式(data format),用來儲存和傳輸資料。
它不是程式語言,而是一種 用文字描述資料結構 的規則。
2. 特點
輕量:只有純文字。
可讀性高:人類容易看懂。
跨平台:不同語言(Java、Python、C++、PHP…)都能處理 JSON。
廣泛應用:Web API、設定檔、資料交換… 都會用到。
3. 格式規則
JSON 的結構就是:
物件 (Object) → {} 包起來,裡面是「鍵:值」
陣列 (Array) → [] 包起來,裡面是多個值
值 (Value) 可以是:字串、數字、布林值、null、物件、陣列
package day1;
import java.io.;
import java.net.;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class Day20Demo {
private static class Result {
String host;
int port;
String status;
String timestamp;
Result(String h, int p, String s) {
this.host = h;
this.port = p;
this.status = s;
this.timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
private static String checkPort(String host, int port) {
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(host, port), 200);
return "OPEN";
} catch (IOException e) {
return "CLOSED";
}
}
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("請輸入要掃描的主機 (例如 localhost): ");
    String host = scanner.nextLine().trim();
    System.out.print("請輸入起始 Port: ");
    int startPort = Integer.parseInt(scanner.nextLine().trim());
    System.out.print("請輸入結束 Port: ");
    int endPort = Integer.parseInt(scanner.nextLine().trim());
    List<Result> results = new ArrayList<>();
    for (int port = startPort; port <= endPort; port++) {
        String status = checkPort(host, port);
        Result r = new Result(host, port, status);
        results.add(r);
        System.out.printf("Port %d -> %s%n", port, status);
    }
    try(BufferedWriter bw = new BufferedWriter(new FileWriter("Day20Demo.json"))){
        bw.write("{\"scan\":[\n");
        for (int i = 0; i < results.size(); i++) {
        Result r = results.get(i);
        bw.write(String.format(
                "  {\"timestamp\":\"%s\",\"host\":\"%s\",\"port\":%d,\"status\":\"%s\"}",
                r.timestamp, r.host, r.port, r.status
        ));
        if (i < results.size() - 1) bw.write(",");
        bw.newLine();
        }
        bw.write("]}");
        System.out.println("已輸出 JSON: Day20Demo.json");
    }catch (IOException e){
        e.printStackTrace();
    }
    try (BufferedWriter bw = new BufferedWriter(new FileWriter("Day20Demo.html"))) {
        bw.write("<!DOCTYPE html><html><head><meta charset='UTF-8'><title>Scan Result</title></head><body>\n");
        bw.write("<h2>掃描結果</h2>\n<table border='1' cellpadding='5'>\n");
        bw.write("<tr><th>Timestamp</th><th>Host</th><th>Port</th><th>Status</th></tr>\n");
        for (Result r : results) {
            bw.write("<tr>");
            bw.write("<td>" + r.timestamp + "</td>");
            bw.write("<td>" + r.host + "</td>");
            bw.write("<td>" + r.port + "</td>");
            bw.write("<td>" + r.status + "</td>");
            bw.write("</tr>\n");
        }
        bw.write("</table></body></html>");
        System.out.println("已輸出 HTML: Day20Demo.html");
    } catch (IOException e) {
        e.printStackTrace();
    }
    scanner.close();
}
}


今天練習這段程式碼學到資料輸出成 JSON
使用 BufferedWriter + FileWriter 將掃描結果存成 JSON 檔案。
學會用 String.format 來格式化字串,使 JSON 結構正確。
了解 JSON 格式的結構與用途,可方便程式間傳輸或後續資料分析。
資料輸出成 HTML
將掃描結果寫成 HTML 表格。
學會 HTML 基本標籤 、、,並用  做簡單樣式。
了解如何將程式資料可視化,方便瀏覽器查看結果。
學到 try-with-resources 確保檔案自動關閉、避免資源洩漏。
程式安全與美化
學會做簡單 HTML 逃脫(escapeHtml),防止資料中出現特殊字元破壞 HTML 結構。
學會根據狀態套用 CSS class (open / closed) 做顏色顯示,提高資料可讀性。
原本覺得寫檔案、做 HTML 很複雜,但透過 逐行拆解後,理解每個語法的用途和流程。
看到自己的程式結果用瀏覽器呈現,很有成就感,比單純印在 console 上更直覺。
學到程式不只是運算邏輯,還可以把結果整理成「可分享、可視化」的形式,增強實用性。
對 Java I/O、網路程式、資料結構和 HTML/CSS 有更實際的理解,也讓我對下一步「多執行緒掃描、顏色化表格、JSON API」更有概念。