Skip to content

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 With

Q2: 为什么数组下标从 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)  '元素2

Q3: 如何清空 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 If

Q5: 如何判断某个键是否存在?

A: 使用 RootItem.Exists 方法检查,使用 Root 访问:

vb
If Json.RootItem.Exists("key") Then
    MsgBox Json.Root("key")
Else
    MsgBox "键不存在"
End If

Q6: 如何遍历 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")
Next

Q7: 如何处理嵌套对象?

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-16
  • GB2312
  • GBK
  • ASCII

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 With

Q15: 如何解析 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 With

Q16: 如何处理 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:

  1. 使用紧凑格式传输:Json.Encode()(不格式化)
  2. 避免深层嵌套的对象查找
  3. 及时释放不需要的对象
  4. 考虑分批处理大量数据

Q20: 全局实例和新建实例有什么区别?

A:

特性VBMAN.Json(全局)New cJson(新建)
生命周期应用程序全程随代码块结束释放
数据共享全局共享独立隔离
使用场景缓存全局配置临时数据处理
注意事项需要手动 Clear自动清理

进阶问题

Q21: 如何构造根节点为数组的 JSON?

A: 先调用 NewItemNewItems

vb
With New cJson
    '根是数组
    With .NewItem()
        .Item("name") = "张三"
    End With
    With .NewItem()
        .Item("name") = "李四"
    End With

    '结果: [{"name": "张三"}, {"name": "李四"}]
    Debug.Print .Encode(, 2, True)
End With

Q22: 如何合并两个 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 Sub

Q23: 如何复制 JSON 对象?

A: 编码后再解码:

vb
Dim Copy As New cJson
Copy.Decode Original.Encode()

Q24: Root 和 Item 有什么区别?

A:

特性RootItem
默认成员是(可用 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")

VB6及其LOGO版权为微软公司所有