披风配置 JSON
基本信息
| 属性 | 值 |
|---|---|
| 解析类 | com.jadarstudios.developercapes.cape.CapeConfigManager#parse |
| 解析库 | Gson(new Gson().fromJson(isr, Map.class)) |
| 顶层结构 | 扁平 Map<String, Object> |
| 仓库内示例 | SampleCape.json |
解析器把整份 JSON 读成一个 Map,然后按每个顶层节点的值的类型分派:
- 值是
Map→parseGroup(...)(命名组) - 值是
String→parseUser(...)(单人)
写法一:命名组
组节点的键是组名(任意字符串),值必须同时含 capeUrl 与 users 两个键:
{
"ExampleGroup1": {
"capeUrl": "http://www.myurl.com/DEV_CAPE.png",
"users": [
"05910308-229d-46bb-a466-e5574dba490c",
"6b4a177a-54ee-4dd6-a50b-d993503892c1"
]
}
}
| 键 | 必需 | 类型 | 含义 |
|---|---|---|---|
capeUrl |
是 | String |
该组共用的披风图片地址 |
users |
是 | 数组 | 获得该披风的玩家 UUID 列表 |
GroupManager#parse 用 instanceof ArrayList / instanceof String 严格校验两者;任一不满足就记 Group %s could not be parsed because it either is invalid or missing elements. 并返回 null(整组丢弃),不会抛异常。
写法二:单人直接映射
键直接是玩家 UUID,值是该玩家的披风地址:
"2fb94c76-d968-4f25-a7cc-91fdccd23868": "http://www.myurl.com/PERSONAL_CAPE.png"
这走的 UserManager#parse(String user, Object cape),此时 cape 参数是 String 而非 ICape,所以走 CapeManager.parse(user, cape.toString()) 按 UUID 建一个独立披风。
两种写法可以混用
SampleCape.json 正是混用示例:顶层一个 ExampleGroup1 组节点 + 一个单人 UUID 节点。解析器逐节点独立分派,互不影响。
错误处理
| 情况 | 行为 |
|---|---|
| 整个 JSON 语法错误 | 捕获 JsonSyntaxException,记 CapeConfig could not be parsed because: 并继续(返回已构造的空 CapeConfig) |
组缺 capeUrl 或 users |
该组返回 null 被丢弃,记 ERROR,其余组正常解析 |
parse(null) |
直接抛 NullPointerException("Can not parse a null input stream!") |
某个 User 解析出 null |
跳过,不中断循环 |
[!NOTE]
parse捕获JsonSyntaxException后不重抛,调用方拿到的是一个字段全空的CapeConfig,且addConfig仍会正常执行。接入方若不检查config.users/config.groups是否为空,会得到「注册成功但没有披风」的结果。
相关条目
- UUID 身份模型 - UUID 从哪来、玩家与披风的对应关系
- registerConfig - 配置如何被下载与登记