移動應用數據交換格式選擇至關重要。XML 雖標準但冗長;自定義二進制雖高效但不可互操作。JSON (JavaScript Object Notation) 以極簡語法、原生支援基本類型、文本可讀性強,成為資源受限設備的理想選擇。本文介紹 JSON 語法、Java ME 專用 API(JSON ME),並提供完整序列化/反序列化實戰代碼。
| 類型 | 起始/終止 | 範例 |
|---|---|---|
| Object | { } | {"name":"Enrique", "age":30} |
| Array | [ ] | ["mobile", "web", "apps"] |
| String | " " | "C. Enrique Ortiz" |
| Number | — | 15569, 3.14, 1.2e3 |
| Boolean | — | true, false |
| Null | — | null |
轉義字符:\" \\ \/ \b \f \n \r \t \uXXXX
請求:https://json-time.appspot.com/time.json?tz=US/Central
響應:
{
"tz": "US/Central",
"hour": 15,
"datetime": "Tue, 05 Aug 2008 15:02:27 -0500",
"second": 27,
"error": false,
"minute": 2
}
Sun 開源專案(Java.net),約 25 KB JAR,支援 CLDC 1.0/1.1 條件編譯。
| 套件 | 核心類 | 說明 |
|---|---|---|
| org.json.me | JSONObject | 名值對集合,核心操作類 |
| JSONArray | 有序值序列 | |
| JSONException | 解析/操作異常 | |
| JSONString / JSONStringer / JSONWriter | 序列化輔助 | |
| JSONTokener | 解析器工具 | |
| org.json.me.util | XML / XMLTokener | XML→JSON 轉換 |
class DataTypes {
public String aString;
public String[] anArray;
public int anInteger;
public long aLong;
public boolean aBoolean;
public DataTypes(String aString, String[] anArray, int anInteger, long aLong, boolean aBoolean) {
this.aString = aString;
this.anArray = anArray;
this.anInteger = anInteger;
this.aLong = aLong;
this.aBoolean = aBoolean;
}
// 序列化為 JSON 字串
public String toJSON() {
JSONObject outer = new JSONObject();
JSONObject inner = new JSONObject();
try {
outer.put("datatypes", inner);
inner.put("aString", aString);
JSONArray ja = new JSONArray();
for (int i = 0; i < anArray.length; i++) ja.put(anArray[i]);
inner.put("anArray", ja);
inner.put("anInteger", anInteger);
inner.put("aLong", aLong);
inner.put("aBoolean", aBoolean);
} catch (JSONException ex) { /* handle */ }
return outer.toString();
}
// 從 JSON 字串反序列化
public void fromJSON(String ji) {
aString = null; anArray = null; anInteger = 0; aLong = 0; aBoolean = false;
try {
JSONObject outer = new JSONObject(ji);
JSONObject inner = outer.getJSONObject("datatypes");
if (inner != null) {
aString = inner.getString("aString");
JSONArray ja = inner.getJSONArray("anArray");
if (ja != null) {
anArray = new String[ja.length()];
for (int i = 0; i < ja.length(); i++) anArray[i] = ja.getString(i);
}
anInteger = inner.getInt("anInteger");
aLong = inner.getLong("aLong");
aBoolean = inner.getBoolean("aBoolean");
}
} catch (Exception e) { /* handle */ }
}
// 除錯輸出
public void dump() {
System.out.println("aString: " + aString);
if (anArray != null) for (int i=0;i
DataTypes dt = new DataTypes(
"C. Enrique Ortiz",
new String[]{"tech","mobile","web","apps"},
15569, 1234567890L, true
);
String json = dt.toJSON();
System.out.println("JSON: " + json);
// {"datatypes":{"aString":"C. Enrique Ortiz","anArray":["tech","mobile","web","apps"],"anInteger":15569,"aLong":1234567890,"aBoolean":true}}
dt.fromJSON(json);
dt.dump(); // 驗證還原正確
JSONTokener)避免一次載入全文。double 不支援,傳輸浮點數可乘 1000 傳 int/long,接收端再除。JSON ME 提供完整、輕量的 JSON 支援,讓 Java ME 應用能以標準、高效、可除錯的格式與後端、Web 服務互操作。掌握 JSONObject/JSONArray 核心 API,即可輕鬆實現雙向序列化。