cJson 常见问题解答(FAQ)
基础问题
Q1: cJson 类在哪里定义?
A: cJson 类定义在 VBMAN 库中,文件位于:
vbman/src/Tools/Json/cJson.cls在项目中使用需要引用 VBMAN 库:
vb
'标准引用方式
Dim Json As New VBMANLIB.cJson
'或使用 VBMAN 全局实例
With VBMAN.Json
'...
End WithQ2: 为什么数组下标从 1 开始而不是 0?
A: cJson 内部使用 VB 的 Collection 对象存储数组,而 VB 的 Collection 下标从 1 开始。这是为了符合 VB 开发者的习惯。
vb
'添加元素使用 0(表示新增)
Json.Items(0) = "元素1"
Json.Items(0) = "元素2"
'访问使用 1-based 索引(通过 Root)
MsgBox Json.Root("items")(1) '元素1
MsgBox Json.Root("items")(2) '元素2Q3: 如何清空 cJson 实例?
A: 使用 Clear 方法:
vb
Json.Clear '清空所有数据注意: 使用 VBMAN.Json 全局实例前建议先调用 Clear:
vb
With VBMAN.Json
.Clear '清理之前的数据
.Item("key") = "value"
End With使用问题
Q4: 如何判断 JSON 解析是否成功?
A: 使用 LastSuccess 属性:
vb
Json.Decode JsonText
If Json.LastSuccess Then
MsgBox "解析成功"
Else
MsgBox "解析失败: " & Json.LastError
End IfQ5: 如何判断某个键是否存在?
A: 使用 RootItem.Exists 方法检查,使用 Root 访问:
vb
If Json.RootItem.Exists("key") Then
MsgBox Json.Root("key")
Else
MsgBox "键不存在"
End IfQ6: 如何遍历 JSON 数组?
A: 使用 Root 访问数组,有两种遍历方式:
vb
'方式一:For Each(推荐)
Dim Item As Variant
For Each Item In Json.Root("data")
Debug.Print Item("name")
Next
'方式二:For 循环(下标从 1 开始)
Dim i As Long
For i = 1 To Json.Root("data").Count
Debug.Print Json.Root("data")(i)("name")
NextQ7: 如何处理嵌套对象?
A: 使用 Root 进行链式访问或分层访问:
vb
'链式访问(推荐)
MsgBox Json.Root("level1")("level2")("level3")
'或使用默认成员特性(更简洁)
MsgBox Json("level1")("level2")("level3")
'分层访问(推荐用于深层嵌套)
Dim Level1 As Object
Dim Level2 As Object
Set Level1 = Json.Root("level1")
Set Level2 = Level1("level2")
MsgBox Level2("level3")编码问题
Q8: 如何让 JSON 显示中文而不是 Unicode?
A: 在 Encode 方法中设置第三个参数为 True:
vb
Json.Encode(, 2, True) '第三个参数 True 表示中文原样显示Q9: 如何格式化输出 JSON 字符串?
A: 在 Encode 方法中设置第二个参数:
vb
Json.Encode(, 2) '使用 2 个空格缩进
Json.Encode(, 4) '使用 4 个空格缩进
Json.Encode(, vbTab) '使用 Tab 缩进Q10: 如何处理特殊字符?
A: cJson 会自动处理特殊字符的转义:
vb
Json.Item("text") = "包含"引号"和\反斜杠的文本"
'输出:"text": "包含""引号""和\\反斜杠的文本"文件操作问题
Q11: 如何从文件加载 JSON?
A: 使用 LoadFrom 方法:
vb
'标准方式
With New cJson
.LoadFrom "C:\data.json"
MsgBox .Item("name")
End With
'链式调用
MsgBox VBMAN.Json.LoadFrom("C:\data.json")("name")Q12: 如何保存 JSON 到文件?
A: 使用 SaveTo 方法:
vb
Json.SaveTo "C:\data.json" '简单保存
Json.SaveTo "C:\data.json", "UTF-8" '指定编码
Json.SaveTo "C:\data.json", "UTF-8", 2, True '格式化并显示中文Q13: 支持哪些字符编码?
A: 支持常见的字符编码:
UTF-8(推荐)UTF-16GB2312GBKASCII
HTTP 相关问题
Q14: 如何发送 JSON 数据?
A: 构造 JSON 字符串后发送:
vb
'构造请求体
Dim Body As String
With New cJson
.Item("key") = "value"
Body = .Encode()
End With
'发送 POST 请求
With New cHttpClient
.SetRequestContentType JsonString
.SendPost "https://api.example.com", Body
End WithQ15: 如何解析 API 返回的 JSON?
A: 使用 ReturnJson 方法:
vb
With VBMAN.HttpClient.Fetch(ReqGet, "https://api.example.com").ReturnJson()
'格式化显示
Text1.Text = .Encode(, 2, True)
'提取数据
If .Item("code") = 200 Then
MsgBox .Item("data")("name")
End If
End WithQ16: 如何处理 JSONP 格式?
A: cJson 的 Decode 方法会自动处理 JSONP 格式:
vb
'以下格式都可以自动解析
Json.Decode "callback({""name"":""张三""});"
Json.Decode "var data = {""name"":""张三""};"
Json.Decode "{""name"":""张三""}" '标准 JSON错误处理
Q17: 常见的错误有哪些?
A: 常见错误及解决方案:
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 下标越界 | 访问了不存在的数组索引 | 检查数组长度再访问 |
| 键不存在 | 访问了不存在的键 | 使用 Exists 方法检查 |
| 类型不匹配 | 数据类型与变量不匹配 | 使用类型转换函数 |
| 解析失败 | JSON 格式错误 | 检查输入字符串格式 |
Q18: 如何调试 JSON 问题?
A: 使用以下调试技巧:
vb
'1. 格式化输出查看结构
Debug.Print Json.Encode(, 2, True)
'2. 检查错误信息
Json.Decode BadJsonText
If Not Json.LastSuccess Then
Debug.Print "错误: " & Json.LastError
End If
'3. 检查数据类型
Debug.Print TypeName(Json.Item("field"))性能问题
Q19: 处理大数据量时有什么建议?
A:
- 使用紧凑格式传输:
Json.Encode()(不格式化) - 避免深层嵌套的对象查找
- 及时释放不需要的对象
- 考虑分批处理大量数据
Q20: 全局实例和新建实例有什么区别?
A:
| 特性 | VBMAN.Json(全局) | New cJson(新建) |
|---|---|---|
| 生命周期 | 应用程序全程 | 随代码块结束释放 |
| 数据共享 | 全局共享 | 独立隔离 |
| 使用场景 | 缓存全局配置 | 临时数据处理 |
| 注意事项 | 需要手动 Clear | 自动清理 |
进阶问题
Q21: 如何构造根节点为数组的 JSON?
A: 先调用 NewItem 或 NewItems:
vb
With New cJson
'根是数组
With .NewItem()
.Item("name") = "张三"
End With
With .NewItem()
.Item("name") = "李四"
End With
'结果: [{"name": "张三"}, {"name": "李四"}]
Debug.Print .Encode(, 2, True)
End WithQ22: 如何合并两个 JSON 对象?
A: 手动复制键值对:
vb
Private Sub MergeJson(Target As cJson, Source As cJson)
Dim Key As Variant
For Each Key In Source.RootItem.Keys
Target.Item(Key) = Source.Item(Key)
Next
End SubQ23: 如何复制 JSON 对象?
A: 编码后再解码:
vb
Dim Copy As New cJson
Copy.Decode Original.Encode()Q24: Root 和 Item 有什么区别?
A:
| 特性 | Root | Item |
|---|---|---|
| 默认成员 | 是(可用 Json("key")) | 否 |
| 返回类型 | Object(Dictionary/Collection) | Variant |
| 链式访问 | 支持 | 有限支持 |
| 主要用途 | 读取数据 | 设置值 |
| 示例 | Json.Root("a")("b") | Json.Item("a") = 1 |
推荐用法:
vb
'设置值用 Item
Json.Item("name") = "张三"
'读取值用 Root
MsgBox Json.Root("name")
MsgBox Json.Root("address")("city") '链式访问嵌套对象
'简写形式(利用 Root 是默认成员)
MsgBox Json("name")
MsgBox Json("address")("city")Q25: 如何处理日期类型?
A: 日期会转为字符串,建议格式化:
vb
Json.Item("created") = Format(Now(), "yyyy-mm-dd HH:mm:ss")