Skip to content

cJson Best Practices and Tips

Usage Recommendations

1. Instance Selection

ScenarioRecommended ApproachDescription
Temporary useWith New cJsonAuto-cleanup after use
Need to persistDim Json As New cJsonCan be passed across methods
Global configVBMAN.JsonGlobal shared, remember to clean

Recommended Code:

vb
'Temporary use - recommended approach
With New VBMANLIB.cJson
    .Item("key") = "value"
    MsgBox .Encode()
End With
'Object auto-released, no manual cleanup needed

2. Array Operation Notes

Important: Array index starts from 1!

vb
With Json.NewItems("items")
    'Add elements using 0
    .Items(0) = "First item"
    .Items(0) = "Second item"
End With

'Access using 1-based index
MsgBox Json.Item("items")(1)  'First item
MsgBox Json.Item("items")(2)  'Second item

3. Timely Cleaning of Global Instance

When using the VBMAN.Json global instance, remember to clean before starting:

vb
With VBMAN.Json
    .Clear  'Important! Clean previous data

    .Item("key") = "value"
    '...
End With

4. Naming Convention Recommendations

vb
'JSON key names recommended: camelCase or snake_case
Json.Item("userName")     'camelCase
Json.Item("user_name")    'snake_case

'Avoid Chinese key names (even though supported)
Json.Item("Username")     'Not recommended, may cause compatibility issues

Performance Optimization

1. Large Batch Data Processing

vb
'Recommended: Estimate array size in advance if possible
Private Sub BatchProcess()
    With New cJson
        With .NewItems("records")
            Dim Rs As ADODB.Recordset
            Set Rs = GetData()

            'Use With statement to reduce object lookup
            Do While Not Rs.EOF
                With .NewItem()
                    .Item("id") = Rs("id")
                    .Item("name") = Rs("name")
                End With
                Rs.MoveNext
            Loop
        End With

        'Single output, avoid multiple Encode calls
        Dim Result As String
        Result = .Encode(, 0)  'Compact format saves space
    End With
End Sub

2. Chained Access vs. Layered Processing

Recommended: Chained Access (concise and clear):

vb
'Direct chained access to nested data
MsgBox Json.Root("user")("profile")("name")
MsgBox Json.Root("data")(1)("title")

Only use layered processing when reusing sub-nodes:

vb
'When needing to use the same sub-node multiple times, layered is more efficient
Dim User As Object
Set User = Json.Root("user")

MsgBox User("name")
MsgBox User("email")
MsgBox User("profile")("age")

Common Pitfalls

Pitfall 1: Forget to Check if Key Exists

vb
'Wrong: Directly access a key that may not exist
MsgBox Json.Item("mayNotExist")  'May error

'Correct: Check existence first
If Json.RootItem.Exists("mayNotExist") Then
    MsgBox Json.Item("mayNotExist")
Else
    MsgBox "Key does not exist"
End If

Pitfall 2: Confuse Root, Item, and Items

vb
'Root - for reading data (default member, returns Object supporting chained access)
MsgBox Json.Root("key")
MsgBox Json.Root("level1")("level2")  'Chained access to nested object

'Item - for setting key-value pairs (has Let/Set)
Json.Item("key") = "value"

'Items - for arrays (Collection), Index=0 means append
Json.Items(0) = "value"  'Add element
MsgBox Json.Root("arr")(1)  'Access element (index starts from 1)

'Wrong examples:
Json.Item(1) = "value"   'Wrong! Item requires string key
Json.Items("key")        'Wrong! Items requires numeric index

Pitfall 3: Collection Index Out of Bounds

vb
'Wrong: Assume collection has elements (cJson uses VB Collection for arrays)
MsgBox Json.Root("items")(1)  'Will error if collection is empty

'Correct: Check Count first
If Json.Root("items").Count > 0 Then
    MsgBox Json.Root("items")(1)
End If

Error Handling Best Practices

vb
Private Sub ProcessJson()
    On Error GoTo ErrorHandler

    Dim Json As New cJson

    'Parse JSON
    Json.Decode JsonText

    If Not Json.LastSuccess Then
        LogError "JSON parse failed: " & Json.LastError
        Exit Sub
    End If

    'Check required fields
    If Not ValidateRequiredFields(Json) Then
        LogError "Missing required fields"
        Exit Sub
    End If

    'Process data
    ProcessData Json

    Exit Sub

ErrorHandler:
    LogError "Processing error: " & Err.Description
End Sub

Private Function ValidateRequiredFields(Json As cJson) As Boolean
    ValidateRequiredFields = True

    If Not Json.RootItem.Exists("code") Then
        ValidateRequiredFields = False
        Exit Function
    End If

    If Not Json.RootItem.Exists("data") Then
        ValidateRequiredFields = False
        Exit Function
    End If
End Function

HTTP Request Integration Recommendations

GET Request Handling

vb
Private Sub HandleGetRequest()
    On Error Resume Next

    With VBMAN.HttpClient.Fetch(ReqGet, "https://api.example.com/data").ReturnJson()
        If .Item("code") <> 200 Then
            MsgBox "Request failed: " & .Item("message")
            Exit Sub
        End If

        'Process successful response
        ProcessSuccessResponse .Item("data")
    End With

    If Err.Number <> 0 Then
        MsgBox "Network error: " & Err.Description
    End If
End Sub

POST Request Handling

vb
Private Sub HandlePostRequest()
    On Error GoTo ErrorHandler

    'Construct request body
    Dim Body As String
    With New cJson
        .Item("action") = "submit"
        .Item("timestamp") = Now()
        Body = .Encode()
    End With

    'Send request
    With New cHttpClient
        .SetRequestContentType JsonString
        .SendPost "https://api.example.com/submit", Body

        'Parse response
        With .ReturnJson()
            Select Case .Item("code")
                Case 200
                    MsgBox "Submit successful"
                Case 400
                    MsgBox "Parameter error: " & .Item("message")
                Case 500
                    MsgBox "Server error"
                Case Else
                    MsgBox "Unknown error: " & .Item("message")
            End Select
        End With
    End With

    Exit Sub

ErrorHandler:
    Debug.Print "Error: " & Err.Description
End Sub

File Operation Recommendations

Safe File Read/Write

vb
Private Sub SafeFileOperation()
    Dim FilePath As String
    FilePath = App.Path & "\data\config.json"

    'Check if file exists (SaveTo will auto-create directories)
    If Dir(FilePath) <> "" Then
        'Backup old file
        FileCopy FilePath, FilePath & ".bak"
    End If

    'Write new content (SaveTo internally calls ToolsFso.AutoMakeDir to create directories)
    With New cJson
        .Item("version") = "1.0"
        .SaveTo FilePath, "UTF-8", 2, True
    End With
End Sub

Note: The SaveTo method internally calls ToolsFso.AutoMakeDir to create directories, no need to manually create them.

Debug Tips

Using Formatted Output

vb
'Development stage: use formatted output
Debug.Print Json.Encode(, 2, True)

'Production environment: use compact format
ResponseText = Json.Encode()

Recording Debug Information

vb
Private Sub LogJson(Json As cJson, Context As String)
    Debug.Print "=== " & Context & " ==="
    Debug.Print Json.Encode(, 2, True)
    Debug.Print "========================"
End Sub

VB6 and LOGO copyright of Microsoft Corporation