Tôi đã viết câu trả lời này khi tôi đang tìm kiếm một giải pháp VBScript thuần túy nhẹ.
Bằng cách kết hợp một trình chuyển đổi JSON sang XML thô sơ, chúng ta có thể xem chuỗi JSON và biến nó thành tài liệu Microsoft.XMLDOM.
Từ đó, chúng tôi sử dụng API XML của Microsoft bao gồm các truy vấn XPath để lấy ra bất kỳ giá trị nào chúng tôi muốn.
Điều này xử lý JSON đơn giản, nhưng, tôi không bao giờ có ý định trả lời này cho bất kỳ điều gì phức tạp hơn.
Để có một giải pháp mạnh mẽ hơn, trình thông dịch JSON tốt nhất là một công cụ Javascript phù hợp. Do đó, tôi thực sự khuyên bạn nên trả lời được chấp nhận cho câu hỏi này, tức là Bất kỳ thư viện tốt nào để phân tích cú pháp JSON trong ASP Cổ điển?
Function JSONtoXML(jsonText)
Dim idx, max, ch, mode, xmldom, xmlelem, xmlchild, name, value
Set xmldom = CreateObject("Microsoft.XMLDOM")
xmldom.loadXML "<xml/>"
Set xmlelem = xmldom.documentElement
max = Len(jsonText)
mode = 0
name = ""
value = ""
While idx < max
idx = idx + 1
ch = Mid(jsonText, idx, 1)
Select Case mode
Case 0
Select Case ch
Case "{"
mode = 1
End Select
Case 1
Select Case ch
Case """"
name = ""
mode = 2
Case "{"
Set xmlchild = xmldom.createElement("tag")
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
Case "["
Set xmlchild = xmldom.createElement("tag")
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
Case "}"
Set xmlelem = xmlelem.parentNode
Case "]"
Set xmlelem = xmlelem.parentNode
End Select
Case 2
Select Case ch
Case """"
mode = 3
Case Else
name = name + ch
End Select
Case 3
Select Case ch
Case ":"
mode = 4
End Select
Case 4
Select Case ch
Case "["
Set xmlchild = xmldom.createElement(name)
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
name = ""
mode = 1
Case "{"
Set xmlchild = xmldom.createElement(name)
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
name = ""
mode = 1
Case """"
value = ""
mode = 5
Case " "
Case Chr(9)
Case Chr(10)
Case Chr(13)
Case Else
value = ch
mode = 7
End Select
Case 5
Select Case ch
Case """"
xmlelem.setAttribute name, value
mode = 1
Case "\"
mode = 6
Case Else
value = value + ch
End Select
Case 6
value = value + ch
mode = 5
Case 7
If Instr("}], " & Chr(9) & vbCr & vbLf, ch) = 0 Then
value = value + ch
Else
xmlelem.setAttribute name, value
mode = 1
Select Case ch
Case "}"
Set xmlelem = xmlelem.parentNode
Case "]"
Set xmlelem = xmlelem.parentNode
End Select
End If
End Select
Wend
Set JSONtoXML = xmlDom
End Function
Tập lệnh trên, chuyển đổi JSON sau:
{
"owningSystemUrl": "http://www.arcgis.com",
"authInfo": {
"tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
"isTokenBasedSecurity": true
}
}
thành:
<xml owningSystemUrl="http://www.arcgis.com">
<authInfo
tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
isTokenBasedSecurity="true" >
</authInfo>
</xml>
Bây giờ chúng ta có thể sử dụng XPath để giải nén tokenServicesUrl
, ví dụ:
dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")