Simple JSON(json-simple)是 Google 開源的輕量級 Java JSON 庫,遵循 Apache 2.0 協議。核心特點:
JSONObject 實現 Map,JSONArray 實現 List,無縫對接集合框架。JSONValue 便捷靜態方法與 JSONParser 高性能解析器。| 類 | 用途 |
|---|---|
| JSONValue | 靜態工具類:parse()、toJSONString() |
| JSONParser | 可配置解析器,支持容器工廠、異常位置定位 |
| JSONObject | 有序 Map 實現,保持鍵插入順序 |
| JSONArray | List 實現,支持隨機訪問 |
| ContentHandler | SAX 事件接口,實現流式處理 |
String json = "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
Object obj = JSONValue.parse(json);
JSONArray array = (JSONArray) obj;
System.out.println(array.get(1)); // 取第二個元素
JSONObject obj2 = (JSONObject) array.get(1);
System.out.println(obj2.get("1")); // 取嵌套對象
JSONParser parser = new JSONParser();
try {
Object obj = parser.parse(jsonString);
// 處理 obj...
} catch (ParseException pe) {
System.err.println("Error at position " + pe.getPosition() + ": " + pe.getMessage());
}
ContainerFactory factory = new ContainerFactory() {
public List creatArrayContainer() { return new LinkedList(); }
public Map createObjectContainer() { return new LinkedHashMap(); }
};
Map json = (Map) parser.parse(jsonText, factory);
// 遍歷保持插入順序
for (Map.Entry entry : json.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
System.out.println(JSONValue.toJSONString(json)); // 序列化回字符串
實現 ContentHandler,在邏輯點返回 false 暫停解析,稍後恢復:
class KeyFinder implements ContentHandler {
private String matchKey;
private Object value;
private boolean found, end;
public void setMatchKey(String key) { this.matchKey = key; }
public Object getValue() { return value; }
public boolean isFound() { return found; }
public boolean isEnd() { return end; }
@Override public void startJSON() { found = false; end = false; }
@Override public void endJSON() { end = true; }
@Override public boolean primitive(Object value) {
if (key != null && key.equals(matchKey)) {
this.value = value; found = true; key = null; return false; // 暫停
}
return true;
}
@Override public boolean startObjectEntry(String key) { this.key = key; return true; }
// 其他事件方法返回 true 繼續...
}
// 使用
KeyFinder finder = new KeyFinder();
finder.setMatchKey("id");
while (!finder.isEnd()) {
parser.parse(jsonText, finder, true); // true 表示可暫停
if (finder.isFound()) {
System.out.println("Found: " + finder.getValue());
finder.setFound(false);
}
}
利用棧在 SAX 事件中構建完整對象樹,最終 getResult() 返回根對象。
JSONParser 實例不可跨線程共用。Long/Double,超大整數可配合容器工廠使用 BigInteger。<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>