这个 JSON 文件 **存在严重的语法错误**,无法被标准的 JSON 解析器正确解析。下面我们来详细分析问题所在,并提供修正版本。
---
## ❌ 问题分析
你给出的 JSON 结构如下:
```json
{
"move_frame": [
"up": [ ... ],
"down": [ ... ],
...
]
}
```
### 主要错误点:
#### 1. `"move_frame"` 是一个 **数组(`[...]`)**,但里面却用了对象的键值对格式 `"up": [...]`
- 在 JSON 中:
- `[ ... ]` 表示 **数组(array)**
- `{ ... }` 表示 **对象(object)**
你在 `move_frame` 后面用了方括号 `[`,表示它是一个数组,但内容却是 `"key": value` 的形式 —— 这是对象的写法!
✅ 正确做法:如果想用键(如 `"up"`, `"down"`)来组织数据,应该使用 **对象 `{}`** 而不是数组 `[]`。
---
## ✅ 正确的 JSON 格式应该是:
```json
{
"move_frame": {
"up": [
{"x": 0, "y": 0, "width": 480, "height": 640},
{"x": 480, "y": 0, "width": 480, "height": 640},
...
],
"down": [
{"x": 0, "y": 0, "width": 480, "height": 640},
...
],
"right": [ ... ],
"left": [ ... ],
"idle": [ ... ]
}
}
```
> ✅ 将 `move_frame` 的 `[` 改为 `{`,并确保每个方向是一个字段名(字符串),其值为帧坐标数组。
---
## 🔧 修复后的完整示例(节选)
```json
{
"move_frame": {
"up": [
{"x": 0, "y": 0, "width": 480, "height": 640},
{"x": 480, "y": 0, "width": 480, "height": 640},
{"x": 960, "y": 0, "width": 480, "height": 640},
{"x": 1440, "y": 0, "width": 480, "height": 640},
{"x": 1920, "y": 0, "width": 480, "height": 640},
{"x": 2400, "y": 0, "width": 480, "height": 640},
{"x": 2880, "y": 0, "width": 480, "height": 640},
{"x": 3360, "y": 0, "width": 480, "height": 640},
{"x": 3840, "y": 0, "width": 480, "height": 640},
{"x": 4320, "y": 0, "width": 480, "height": 640},
{"x": 4800, "y": 0, "width": 480, "height": 640},
{"x": 5280, "y": 0, "width": 480, "height": 640},
{"x": 5760, "y": 0, "width": 480, "height": 640},
{"x": 6240, "y": 0, "width": 480, "height": 640},
{"x": 6720, "y": 0, "width": 480, "height": 640},
{"x": 7200, "y": 0, "width": 480, "height": 640},
{"x": 7680, "y": 0, "width": 480, "height": 640},
{"x": 0, "y": 640, "width": 480, "height": 640},
{"x": 480, "y": 640, "width": 480, "height": 640},
{"x": 960, "y": 640, "width": 480, "height": 640},
{"x": 1440, "y": 640, "width": 480, "height": 640},
{"x": 1920, "y": 640, "width": 480, "height": 640},
{"x": 2400, "y": 640, "width": 480, "height": 640},
{"x": 2880, "y": 640, "width": 480, "height": 640},
{"x": 3360, "y": 640, "width": 480, "height": 640},
{"x": 3840, "y": 640, "width": 480, "height": 640},
{"x": 4320, "y": 640, "width": 480, "height": 640},
{"x": 4800, "y": 640, "width": 480, "height": 640},
{"x": 5280, "y": 640, "width": 480, "height": 640},
{"x": 5760, "y": 640, "width": 480, "height": 640},
{"x": 6240, "y": 640, "width": 480, "height": 640},
{"x": 6720, "y": 640, "width": 480, "height": 640},
{"x": 7200, "y": 640, "width": 480, "height": 640},
{"x": 7680, "y": 640, "width": 480, "height": 640}
],
"down": [
{"x": 0, "y": 0, "width": 480, "height": 640},
{"x": 480, "y": 0, "width": 480, "height": 640},
{"x": 960, "y": 0, "width": 480, "height": 640},
{"x": 1440, "y": 0, "width": 480, "height": 640},
{"x": 1920, "y": 0, "width": 480, "height": 640},
{"x": 2400, "y": 0, "width": 480, "height": 640},
{"x": 2880, "y": 0, "width": 480, "height": 640},
{"x": 3360, "y": 0, "width": 480, "height": 640},
{"x": 3840, "y": 0, "width": 480, "height": 640},
{"x": 4320, "y": 0, "width": 480, "height": 640},
{"x": 4800, "y": 0, "width": 480, "height": 640},
{"x": 5280, "y": 0, "width": 480, "height": 640},
{"x": 5760, "y": 0, "width": 480, "height": 640},
{"x": 0, "y": 640, "width": 480, "height": 640},
{"x": 480, "y": 640, "width": 480, "height": 640},
{"x": 960, "y": 640, "width": 480, "height": 640},
{"x": 1440, "y": 640, "width": 480, "height": 640},
{"x": 1920, "y": 640, "width": 480, "height": 640},
{"x": 2400, "y": 640, "width": 480, "height": 640},
{"x": 2880, "y": 640, "width": 480, "height": 640},
{"x": 3360, "y": 640, "width": 480, "height": 640},
{"x": 3840, "y": 640, "width": 480, "height": 640},
{"x": 4320, "y": 640, "width": 480, "height": 640},
{"x": 4800, "y": 640, "width": 480, "height": 640},
{"x": 5280, "y": 640, "width": 480, "height": 640},
{"x": 5760, "y": 640, "width": 480, "height": 640},
{"x": 0, "y": 1280, "width": 480, "height": 640},
{"x": 480, "y": 1280, "width": 480, "height": 640},
{"x": 960, "y": 1280, "width": 480, "height": 640},
{"x": 1440, "y": 1280, "width": 480, "height": 640},
{"x": 1920, "y": 1280, "width": 480, "height": 640},
{"x": 2400, "y": 1280, "width": 480, "height": 640},
{"x": 2880, "y": 1280, "width": 480, "height": 640},
{"x": 3360, "y": 1280, "width": 480, "height": 640},
{"x": 3840, "y": 1280, "width": 480, "height": 640},
{"x": 4320, "y": 1280, "width": 480, "height": 640},
{"x": 4800, "y": 1280, "width": 480, "height": 640},
{"x": 5280, "y": 1280, "width": 480, "height": 640},
{"x": 5760, "y": 1280, "width": 480, "height": 640}
],
"right": [
{"x": 0, "y": 0, "width": 480, "height": 640},
{"x": 480, "y": 0, "width": 480, "height": 640},
{"x": 960, "y": 0, "width": 480, "height": 640},
{"x": 1440, "y": 0, "width": 480, "height": 640},
{"x": 1920, "y": 0, "width": 480, "height": 640},
{"x": 2400, "y": 0, "width": 480, "height": 640},
{"x": 2880, "y": 0, "width": 480, "height": 640},
{"x": 3360, "y": 0, "width": 480, "height": 640},
{"x": 3840, "y": 0, "width": 480, "height": 640},
{"x": 4320, "y": 0, "width": 480, "height": 640},
{"x": 4800, "y": 0, "width": 480, "height": 640},
{"x": 5280, "y": 0, "width": 480, "height": 640},
{"x": 5760, "y": 0, "width": 480, "height": 640},
{"x": 6240, "y": 0, "width": 480, "height": 640},
{"x": 6720, "y": 0, "width": 480, "height": 640},
{"x": 7200, "y": 0, "width": 480, "height": 640},
{"x": 7680, "y": 0, "width": 480, "height": 640},
{"x": 0, "y": 640, "width": 480, "height": 640},
{"x": 480, "y": 640, "width": 480, "height": 640},
{"x": 960, "y": 640, "width": 480, "height": 640},
{"x": 1440, "y": 640, "width": 480, "height": 640},
{"x": 1920, "y": 640, "width": 480, "height": 640},
{"x": 2400, "y": 640, "width": 480, "height": 640},
{"x": 2880, "y": 640, "width": 480, "height": 640},
{"x": 3360, "y": 640, "width": 480, "height": 640},
{"x": 3840, "y": 640, "width": 480, "height": 640},
{"x": 4320, "y": 640, "width": 480, "height": 640},
{"x": 4800, "y": 640, "width": 480, "height": 640},
{"x": 5280, "y": 640, "width": 480, "height": 640},
{"x": 5760, "y": 640, "width": 480, "height": 640},
{"x": 6240, "y": 640, "width": 480, "height": 640},
{"x": 6720, "y": 640, "width": 480, "height": 640},
{"x": 7200, "y": 640, "width": 480, "height": 640},
{"x": 7680, "y": 640, "width": 480, "height": 640}
],
"left": [
{"x": 0, "y": 0, "width": 480, "height": 640},
{"x": 480, "y": 0, "width": 480, "height": 640},
{"x": 960, "y": 0, "width": 480, "height": 640},
{"x": 1440, "y": 0, "width": 480, "height": 640},
{"x": 1920, "y": 0, "width": 480, "height": 640},
{"x": 2400, "y": 0, "width": 480, "height": 640},
{"x": 2880, "y": 0, "width": 480, "height": 640},
{"x": 3360, "y": 0, "width": 480, "height": 640},
{"x": 3840, "y": 0, "width": 480, "height": 640},
{"x": 4320, "y": 0, "width": 480, "height": 640},
{"x": 4800, "y": 0, "width": 480, "height": 640},
{"x": 5280, "y": 0, "width": 480, "height": 640},
{"x": 5760, "y": 0, "width": 480, "height": 640},
{"x": 6240, "y": 0, "width": 480, "height": 640},
{"x": 6720, "y": 0, "width": 480, "height": 640},
{"x": 7200, "y": 0, "width": 480, "height": 640},
{"x": 7680, "y": 0, "width": 480, "height": 640},
{"x": 0, "y": 640, "width": 480, "height": 640},
{"x": 480, "y": 640, "width": 480, "height": 640},
{"x": 960, "y": 640, "width": 480, "height": 640},
{"x": 1440, "y": 640, "width": 480, "height": 640},
{"x": 1920, "y": 640, "width": 480, "height": 640},
{"x": 2400, "y": 640, "width": 480, "height": 640},
{"x": 2880, "y": 640, "width": 480, "height": 640},
{"x": 3360, "y": 640, "width": 480, "height": 640},
{"x": 3840, "y": 640, "width": 480, "height": 640},
{"x": 4320, "y": 640, "width": 480, "height": 640},
{"x": 4800, "y": 640, "width": 480, "height": 640},
{"x": 5280, "y": 640, "width": 480, "height": 640},
{"x": 5760, "y": 640, "width": 480, "height": 640},
{"x": 6240, "y": 640, "width": 480, "height": 640},
{"x": 6720, "y": 640, "width": 480, "height": 640},
{"x": 7200, "y": 640, "width": 480, "height": 640},
{"x": 7680, "y": 640, "width": 480, "height": 640}
],
"idle": [
{"x": 0, "y": 0, "width": 267, "height": 435},
{"x": 267, "y": 0, "width": 267, "height": 435},
{"x": 534, "y": 0, "width": 267, "height": 435},
{"x": 801, "y": 0, "width": 268, "height": 435},
{"x": 0, "y": 435, "width": 267, "height": 435},
{"x": 267, "y": 435, "width": 267, "height": 435},
{"x": 534, "y": 435, "width": 267, "height": 435},
{"x": 801, "y": 435, "width": 268, "height": 435},
{"x": 0, "y": 870, "width": 267, "height": 435},
{"x": 267, "y": 870, "width": 267, "height": 435},
{"x": 534, "y": 870, "width": 267, "height": 435},
{"x": 801, "y": 870, "width": 268, "height": 435},
{"x": 0, "y": 1305, "width": 267, "height": 437},
{"x": 267, "y": 1305, "width": 267, "height": 437},
{"x": 534, "y": 1305, "width": 267, "height": 437},
{"x": 801, "y": 1305, "width": 268, "height": 437}
]
}
}
```
---
## ✅ 如何验证 JSON 是否正确?
你可以将修改后的 JSON 粘贴到以下工具中验证:
- [https://jsonlint.com](https://jsonlint.com)
- VS Code 内置 JSON 验证
- Python 测试代码:
```python
import json
with open('animation.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print("JSON is valid!")
```
---
## 💡 建议用途说明
这类 JSON 通常用于:
- 游戏角色动画帧定义(Sprite Sheet)
- 每个 `"direction"` 对应一组 `(x, y, width, height)` 的子图区域
- 可配合 Pygame、Unity、Cocos、LayaAir 等引擎使用
例如在 Pygame 中可以这样读取一帧:
```python
rect = pygame.Rect(frame['x'], frame['y'], frame['width'], frame['height'])
```
---