Phân tích cú pháp tệp JSON với VBA

vbano1

SMod
Thành viên BQT
Nếu bạn hỏi file JSON là gì, thì bạn hãy thử google tìm hiểu. Nếu bạn có một chút kiến thức về Dictionary của VBA thì bài viết dưới đây khá là dễ đọc. Cấu trúc file JSON thực chất là cấu trúc của một Dictionary.
File JSON nhẹ, và truy xuất kết quả nhanh nên được ưa chuộng. Lưu dữ liệu dưới file JSON sẽ cho hiệu quả cao hơn là lưu dữ liệu trong một file Excel bởi tốc độ truy xuất cực cao của nó.
Trong các ngôn ngữ khác, việc đọc một file JSON rất dễ dàng. Tôi tự hỏi VBA có thể đọc và phân tích file JSON được hay không?
Xin giới thiệu các bạn bài viết dưới đây:
==================================
Script có thể được thực thi trên VBA bằng cách sử dụng ScriptControl của đối tượng COM. Điều đó có nghĩa là bạn có thể phân tích cú pháp các tệp JSON ngay cả với VBA, phải không?
Mã:
Sub VBA_de_JSON()

    Const cnsJSONString As String = "{ ""familyname"":""yamada"", ""personalname"":""tarou"" }"
    
    Dim sc      As Object
    Dim strFunc As String
    Dim objJSON As Object
    
    Set sc = CreateObject("ScriptControl")
    
    sc.Language = "JScript"
    
    'Chuoi ham phan tich cu phap thanh json
    strFunc = "function jsonParse(s) { return eval('(' + s + ')'); }"
    'Them ham
    sc.AddCode strFunc
    'Thuc thi ham duoc them, cat ket qua vao bien so
    Set objJSON = sc.CodeObject.jsonParse(cnsJSONString)
    
    'Hoac co the su dung code nhu duoi day
    'Set objJSON = sc.Run("jsonParse", cnsJSONString)

    MsgBox objJSON.familyname
    
    Set objJSON = Nothing
    Set sc = Nothing
    
End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

Ta đã có thể truy cập nó theo cách tương tự như javascript.

Sử dụng ADODB.Stream để đọc file JSON.
Nói là file JSON, thực chất nó cũng như file txt bạn lưu dưới dạng UTF-8. Mà VBA thì đọc file txt UTF-8 quá đơn giản bằng ADODB.Stream của COM Object. Trên diễn đàn trong Box thao tác với file, các bạn tìm lại các bài về ADO sẽ thấy.
Nội dung file JSON như thế nào?
JSON:
{
    "familyname":"yamada",
    "personalname":"tarou"
}
Đó, bạn hãy lưu file trên vào ổ D ( D:\json.txt ). Và bây giờ ta chạy code dưới đây :
Mã:
Sub VBA_de_JSON2()

    Dim sc      As Object
    Dim strFunc As String
    Dim objJSON As Object
    
    Set sc = CreateObject("ScriptControl")
    
    sc.Language = "JScript"
    
    'Chuoi ham phan tich cu phap thanh json
    strFunc = "function jsonParse(s) { return eval('(' + s + ')'); }"
    'Them ham
    sc.AddCode strFunc
    'Thuc thi ham duoc them
    Set objJSON = sc.CodeObject.jsonParse(ReadUTF8Text("D:\json.txt"))

    MsgBox objJSON.personalname
    
    Set objJSON = Nothing
    Set sc = Nothing
    
End Sub

Function ReadUTF8Text(argPath As String) As String

    Dim buf  As String

    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Type = 2           'adTypeText
        .LineSeparator = -1 'adCrLf
        .Open
        .LoadFromFile argPath
        buf = .ReadText(-1) 'adReadAll
        .Close
    End With
    
    ReadUTF8Text = buf

End Function
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

Vấn đề: Nếu bạn sử dụng từ khóa trong JSON (key) trùng với tên thuộc tính hay phương thức của VBA, thì khi biên dịch có khả năng phát sinh ra lỗi. Làm thế nào để không thay đổi tên từ khóa (key) mà không để xảy ra lỗi là điều tôi đang suy nghĩ, quả thực là hơi khó khăn ở chỗ này.

Mặc dù là VBA nhưng chúng ta đã có thể truy cập và phân tích dữ liệu từ một file JSON.
Nguồn tham khảo và dịch:
 
Top