VB6/VBA용 JSON 파서가 있습니까?
VB6를 사용합니다.내가 제어하는 서비스는 현재 SOAP/XML 메시지 또는 JSON을 반환할 수 있습니다. 타입1)이된 VB6의 SOAP 타입(버전 1)을 할 수 가 매우 .object
- 다음과 같은 단순한 타입과 달리string
,int
VB6를 반환된 오브젝트로 재생하기 위해 무엇을 해야 하는지 아직 알 수 없습니다.
그래서 웹 서비스에서 응답을 JSON 문자열로 직렬화할 수 있다고 생각했습니다.VB6용 JSON 파서가 존재합니까?
다양한 언어로 된 JSON 파서의 최신 목록(메인 페이지 하단 참조)은 JSON.org을 참조하십시오.이 글의 작성 시점에서는, 몇개의 다른 JSON 파서에의 링크가 표시됩니다만, VB6/VBA용의 것은 1개 뿐입니다(그 외의 것은 입니다).네트워크):
-
- zip 파일을 다운로드하려고 했을 때 Windows에서 데이터가 손상되었다고 합니다.하지만 7-zip으로 파일을 꺼낼 수 있었습니다.Windows 에서는 zip 파일의 메인 「폴더」가 폴더로 인식되지 않기 때문에, 7-zip으로 그 메인 「폴더」의 내용을 확인할 수 있기 때문에, 그것을 열어, 거기에 따라서 파일을 추출할 수 있습니다.
이 VB JSON 라이브러리의 실제 구문은 매우 간단합니다.
Dim p As Object Set p = JSON.parse(strFormattedJSON) 'Print the text of a nested property ' Debug.Print p.Item("AddressClassification").Item("Description") 'Print the text of a property within an array ' Debug.Print p.Item("Candidates")(4).Item("ZipCode")
- 주의: VBA 에디터의 [툴]> [참조]에서 "Microsoft 스크립팅 런타임" 및 "Microsoft ActiveX Data Objects 2.8" 라이브러리를 참조로 추가해야 합니다.
- 주의: VBJSON 코드는 실제로 구글 코드 프로젝트 vba-json을 기반으로 합니다.그러나 VBJSON에서는 원래 버전에서 몇 가지 버그 수정을 약속합니다.
Ozmike 솔루션을 기반으로 구축했지만 나에게는 효과가 없었습니다(Excel 2013 및 IE10).그 이유는 노출된 JSON 객체의 메서드를 호출할 수 없었기 때문입니다.그래서 그 방법은 이제 DOMElement에 부착된 기능을 통해 노출된다.이것이 가능한지 몰랐습니다(IDispatch-thing임에 틀림없습니다), 감사합니다.
오즈마이크가 말했듯이, 제3자 립은 없고, 코드만 30줄이야.
Option Explicit
Public JSON As Object
Private ie As Object
Public Sub initJson()
Dim html As String
html = "<!DOCTYPE html><head><script>" & _
"Object.prototype.getItem=function( key ) { return this[key] }; " & _
"Object.prototype.setItem=function( key, value ) { this[key]=value }; " & _
"Object.prototype.getKeys=function( dummy ) { keys=[]; for (var key in this) if (typeof(this[key]) !== 'function') keys.push(key); return keys; }; " & _
"window.onload = function() { " & _
"document.body.parse = function(json) { return JSON.parse(json); }; " & _
"document.body.stringify = function(obj, space) { return JSON.stringify(obj, null, space); }" & _
"}" & _
"</script></head><html><body id='JSONElem'></body></html>"
Set ie = CreateObject("InternetExplorer.Application")
With ie
.navigate "about:blank"
Do While .Busy: DoEvents: Loop
Do While .readyState <> 4: DoEvents: Loop
.Visible = False
.document.Write html
.document.Close
End With
' This is the body element, we call it JSON:)
Set JSON = ie.document.getElementById("JSONElem")
End Sub
Public Function closeJSON()
ie.Quit
End Function
다음 테스트에서는 JavaScript 개체를 처음부터 구성한 후 문자열화합니다.그런 다음 오브젝트를 해석하고 키를 반복한다.
Sub testJson()
Call initJson
Dim jsObj As Object
Dim jsArray As Object
Debug.Print "Construction JS object ..."
Set jsObj = JSON.Parse("{}")
Call jsObj.setItem("a", 1)
Set jsArray = JSON.Parse("[]")
Call jsArray.setItem(0, 13)
Call jsArray.setItem(1, Math.Sqr(2))
Call jsArray.setItem(2, 15)
Call jsObj.setItem("b", jsArray)
Debug.Print "Object: " & JSON.stringify(jsObj, 4)
Debug.Print "Parsing JS object ..."
Set jsObj = JSON.Parse("{""a"":1,""b"":[13,1.4142135623730951,15]}")
Debug.Print "a: " & jsObj.getItem("a")
Set jsArray = jsObj.getItem("b")
Debug.Print "Length of b: " & jsArray.getItem("length")
Debug.Print "Second element of b: "; jsArray.getItem(1)
Debug.Print "Iterate over all keys ..."
Dim keys As Object
Set keys = jsObj.getKeys("all")
Dim i As Integer
For i = 0 To keys.getItem("length") - 1
Debug.Print keys.getItem(i) & ": " & jsObj.getItem(keys.getItem(i))
Next i
Call closeJSON
End Sub
출력
Construction JS object ...
Object: {
"a": 1,
"b": [
13,
1.4142135623730951,
15
]
}
Parsing JS object ...
a: 1
Length of b: 3
Second element of b: 1,4142135623731
Iterate over all keys ...
a: 1
b: 13,1.4142135623730951,15
Json은 문자열에 불과하기 때문에 구조가 아무리 복잡해도 올바르게 조작할 수 있으면 간단하게 처리할 수 있습니다.이 트릭을 사용하기 위해 외부 라이브러리나 컨버터를 사용할 필요는 없다고 생각합니다.다음은 문자열 조작을 사용하여 json 데이터를 해석한 예입니다.
Sub GetJsonContent()
Dim http As New XMLHTTP60, itm As Variant
With http
.Open "GET", "http://jsonplaceholder.typicode.com/users", False
.send
itm = Split(.responseText, "id"":")
End With
x = UBound(itm)
For y = 1 To x
Cells(y, 1) = Split(Split(itm(y), "name"": """)(1), """")(0)
Cells(y, 2) = Split(Split(itm(y), "username"": """)(1), """")(0)
Cells(y, 3) = Split(Split(itm(y), "email"": """)(1), """")(0)
Cells(y, 4) = Split(Split(itm(y), "street"": """)(1), """")(0)
Next y
End Sub
"vba json"을 검색한 후 이 페이지에 계속 접속하는 사람들에게 큰 도움이 되었으면 합니다.
나는 이 페이지가 매우 도움이 된다는 것을 알았습니다.JSON 형식의 데이터 처리를 처리하는 여러 Excel 호환 VBA 클래스를 제공합니다.
VBA-JSON by Tim Hall, MIT 라이선스 및 GitHub.2014년 말에 등장한 vba-json의 또 다른 분기점입니다.Mac Office 및 Windows 32비트 및 64비트에서 작동한다고 주장합니다.
업데이트: 이 블로그 투고에서는 Eval을 사용하는 것보다 JSON을 해석하는 안전한 방법을 찾았습니다.Eval의 위험성에 대해 설명하고 있습니다.http://exceldevelopmentplatform.blogspot.com/2018/01/vba-parse-json-safer-with-jsonparse-and.html
파티에 늦었지만 미안하지만 가장 쉬운 방법은 Microsoft Script Control을 사용하는 것입니다.VBA를 사용하는 샘플코드입니다드릴인하는CallByName
'Tools->References->
'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx
Private Sub TestJSONParsingWithCallByName()
Dim oScriptEngine As ScriptControl
Set oScriptEngine = New ScriptControl
oScriptEngine.Language = "JScript"
Dim sJsonString As String
sJsonString = "{'key1': 'value1' ,'key2': { 'key3': 'value3' } }"
Dim objJSON As Object
Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")")
Debug.Assert VBA.CallByName(objJSON, "key1", VbGet) = "value1"
Debug.Assert VBA.CallByName(VBA.CallByName(objJSON, "key2", VbGet), "key3", VbGet) = "value3"
End Sub
JSON/VBA 관련 토픽을 검토하는 일련의 Q&A를 실시했습니다.
Q1 Windows의 Excel VBA에서 IDE의 대문자의 동작에 의해 파싱된 JSON의 닷 구문 트래버스의 문제를 경감하려면 어떻게 해야 합니까?
Q2 Windows의 Excel VBA에서 해석된 JSON 어레이를 루프하는 방법은 무엇입니까?
Q3 Windows의 Excel VBA에서 해석된 JSON 변수에 대해 "객체 객체" 대신 문자열화된 JSON 응답을 얻는 방법은 무엇입니까?
Q4 Windows Excel VBA에서 JSON 키가 "런타임 오류 '438: 개체가 이 속성 또는 메서드를 지원하지 않음"을 미연에 방지하도록 하려면 어떻게 해야 합니까?
Q5 Windows의 Excel VBA에서는 해석된 JSON 변수의 경우 이 JScriptTypeInfo는 무엇입니까?
이것은 "네이티브" VB JSON 라이브러리입니다.
IE8+에 이미 있는 JSON을 사용할 수 있습니다.이렇게 하면 오래되고 테스트되지 않은 서드파티 라이브러리에 의존하지 않아도 됩니다.
여기서 아메데우스의 대체 버전을 참조한다.
Sub myJSONtest()
Dim oJson As Object
Set oJson = oIE_JSON() ' See below gets IE.JSON object
' using json objects
Debug.Print oJson.parse("{ ""hello"": ""world"" }").hello ' world
Debug.Print oJson.stringify(oJson.parse("{ ""hello"": ""world"" }")) ' {"hello":"world"}
' getting items
Debug.Print oJson.parse("{ ""key1"": ""value1"" }").key1 ' value1
Debug.Print oJson.parse("{ ""key1"": ""value1"" }").itemGet("key1") ' value1
Debug.Print oJson.parse("[ 1234, 4567]").itemGet(1) ' 4567
' change properties
Dim o As Object
Set o = oJson.parse("{ ""key1"": ""value1"" }")
o.propSetStr "key1", "value\""2"
Debug.Print o.itemGet("key1") ' value\"2
Debug.Print oJson.stringify(o) ' {"key1":"value\\\"2"}
o.propSetNum "key1", 123
Debug.Print o.itemGet("key1") ' 123
Debug.Print oJson.stringify(o) ' {"key1":123}
' add properties
o.propSetNum "newkey", 123 ' addkey! JS MAGIC
Debug.Print o.itemGet("newkey") ' 123
Debug.Print oJson.stringify(o) ' {"key1":123,"newkey":123}
' assign JSON 'objects' to properties
Dim o2 As Object
Set o2 = oJson.parse("{ ""object2"": ""object2value"" }")
o.propSetJSON "newkey", oJson.stringify(o2) ' set object
Debug.Print oJson.stringify(o) ' {"key1":123,"newkey":{"object2":"object2value"}}
Debug.Print o.itemGet("newkey").itemGet("object2") ' object2value
' change array items
Set o = oJson.parse("[ 1234, 4567]") '
Debug.Print oJson.stringify(o) ' [1234,4567]
Debug.Print o.itemGet(1)
o.itemSetStr 1, "234"
Debug.Print o.itemGet(1)
Debug.Print oJson.stringify(o) ' [1234,"234"]
o.itemSetNum 1, 234
Debug.Print o.itemGet(1)
Debug.Print oJson.stringify(o) ' [1234,234]
' add array items
o.itemSetNum 5, 234 ' add items! JS Magic
Debug.Print o.itemGet(5) ' 234
Debug.Print oJson.stringify(o) ' [1234,234,null,null,null,234]
' assign JSON object to array item
o.itemSetJSON 3, oJson.stringify(o2) ' assign object
Debug.Print o.itemGet(3) '[object Object]
Debug.Print oJson.stringify(o.itemGet(3)) ' {"object2":"object2value"}
Debug.Print oJson.stringify(o) ' [1234,234,null,{"object2":"object2value"},null,234]
oIE_JSON_Quit ' quit IE, must shut down or the IE sessions remain.
Debug.Print oJson.stringify(o) ' can use after but but IE server will shutdown... soon
End Sub
IE를 사용하다VB★JSON
. son!
Public g_IE As Object ' global
Public Function oIE_JSON() As Object
' for array access o.itemGet(0) o.itemGet("key1")
JSON_COM_extentions = "" & _
" Object.prototype.itemGet =function( i ) { return this[i] } ; " & _
" Object.prototype.propSetStr =function( prop , val ) { eval('this.' + prop + ' = ""' + protectDoubleQuotes (val) + '""' ) } ; " & _
" Object.prototype.propSetNum =function( prop , val ) { eval('this.' + prop + ' = ' + val + '') } ; " & _
" Object.prototype.propSetJSON =function( prop , val ) { eval('this.' + prop + ' = ' + val + '') } ; " & _
" Object.prototype.itemSetStr =function( prop , val ) { eval('this[' + prop + '] = ""' + protectDoubleQuotes (val) + '""' ) } ; " & _
" Object.prototype.itemSetNum =function( prop , val ) { eval('this[' + prop + '] = ' + val ) } ; " & _
" Object.prototype.itemSetJSON =function( prop , val ) { eval('this[' + prop + '] = ' + val ) } ; " & _
" function protectDoubleQuotes (str) { return str.replace(/\\/g, '\\\\').replace(/""/g,'\\""'); }"
' document.parentwindow.eval dosen't work some versions of ie eg ie10?
IEEvalworkaroundjs = "" & _
" function IEEvalWorkAroundInit () { " & _
" var x=document.getElementById(""myIEEvalWorkAround"");" & _
" x.IEEval= function( s ) { return eval(s) } ; } ;"
g_JS_framework = "" & _
JSON_COM_extentions & _
IEEvalworkaroundjs
' need IE8 and DOC type
g_JS_HTML = "<!DOCTYPE html> " & _
" <script>" & g_JS_framework & _
"</script>" & _
" <body>" & _
"<script id=""myIEEvalWorkAround"" onclick=""IEEvalWorkAroundInit()"" ></script> " & _
" HEllo</body>"
On Error GoTo error_handler
' Create InternetExplorer Object
Set g_IE = CreateObject("InternetExplorer.Application")
With g_IE
.navigate "about:blank"
Do While .Busy: DoEvents: Loop
Do While .ReadyState <> 4: DoEvents: Loop
.Visible = False ' control IE interface window
.Document.Write g_JS_HTML
End With
Set objID = g_IE.Document.getElementById("myIEEvalWorkAround")
objID.Click ' create eval
Dim oJson As Object
'Set oJson = g_IE.Document.parentWindow.Eval("JSON") ' dosen't work some versions of IE
Set oJson = objID.IEEval("JSON")
Set objID = Nothing
Set oIE_JSON = oJson
Exit Function
error_handler:
MsgBox ("Unexpected Error, I'm quitting. " & Err.Description & ". " & Err.Number)
g_IE.Quit
Set g_IE = Nothing
End Function
Public Function oIE_JSON_Quit()
g_IE.Quit
Exit Function
End Function
도움이 될 것 같으면 투표하세요.
VB6 - JsonBag, 다른 JSON 파서/제너레이터도 문제없이 VBA로 Import할 수 있습니다.
사용을 권장합니다.네트워크 컴포넌트를 사용할 수 있습니다.VB6에서 Interop을 통한 네트워크 컴포넌트 - 튜토리얼을 소개합니다.내 추측으로는 그렇다.네트워크 컴포넌트는 VB6용으로 생산된 제품보다 신뢰성과 지원이 우수합니다.
Microsoft 에는 컴포넌트가 있습니다.DataContractJsonSerializer 또는 JavaScriptSerializer와 같은 네트워크 프레임워크.JSON과 같은 서드파티 라이브러리를 사용할 수도 있습니다.네트워크
VB로 Excel-DNA Add-in을 작성할 수 있습니다.NET. Excel-DNA는 에서 XLL을 쓸 수 있는 얇은 라이브러리입니다.NET. 이렇게 하면 전체로 접근할 수 있습니다.모든 커스텀 클래스에서 JSON을 역직렬화하는 JSON 프레임워크인 http://james.newtonking.com/json 등의 기능을 사용할 수 있습니다.
VB를 사용하여 Excel용 범용 Excel JSON 클라이언트를 구축하는 방법에 대해 자세히 설명합니다.네트워크:
http://optionexplicitvba.com/2014/05/09/developing-a-json-excel-add-in-with-vb-net/
다음은 코드에 대한 링크입니다.
이것은 오래된 게시물입니다만, 최근 오래된 VB6 앱에 웹 서비스 사용을 추가하는 중에 우연히 발견했습니다.승인된 응답(VB-JSON)은 아직 유효하며 정상적으로 동작하고 있습니다.그러나 Chilkat은 REST와 JSON 기능을 포함하도록 업데이트 되어 있어 원스톱(유료) 툴이 되어 있습니다.또한 붙여넣은 JSON 데이터를 구문 분석하는 코드를 생성하는 온라인 코드 생성기도 있습니다.
VB6, VBA, VB에 필요한 경우NET, C#, Delphi 또는 Windows 플랫폼 상의 다른 프로그래밍 언어 거의 모든 것을 JSON Essentials에서 확인하십시오.이 기능은 단순히 JSON을 해석하고 쿼리하는 데 그치지 않습니다.JSON Essentials 를 사용하면, 오브젝트를 JSON 에 시리얼화 해, 필요에 따라서 JSON HTTP 콜을 발신해, JSON DOM 를 해석할 수 있습니다.또, 파일, 레지스트리, 메모리 스트림, 또는 HTTP/HTTPS 를 사용해 JSON 데이터를 UTF-8/16/32/ASCII 및 ASCII 에 써넣어 로드하는 것도 가능합니다.게다가 매우 빠르고 안정적이며 표준 준거성이 뛰어나며, 적극적으로 개발 및 지원되고 있습니다.그리고 무료 라이선스도 있어요.
다음은 간단한 샘플입니다.첫 번째 샘플은 JSON 해석 및 쿼리 방법을 보여줍니다.
' Create JSON document object.
Dim document As JsonDocument
Set document = New JsonDocument
' Parse JSON.
document.parse "{""a"":true,""b"":123,""c"":{},""d"":[""abc""]}"
' Select the first node of the 'd' node using JSON Pointer
' starting from the root document node.
Dim node_abc As IJsonNode
Set node_abc = document.root.select("/d/0")
' Select node 'a' starting from the previously selected
' first child node of node 'd' and traversing first up to
' the root node and then down to node 'a' using Relative
' JSON Pointer.
Dim node_a As IJsonNode
Set node_a = node_abc.select("rel:2/a")
다음은 파일 저장/로딩에 대한 내용입니다.
' Load JSON from a UTF-16 file in the current directory
document.load "file://test.json", "utf-16"
' Save document to the current directory using UTF-8 encoding.
document.save "file://test.json", "utf-8"
이것이 JSON Essentials를 사용하여 HTTP JSON 요청을 만드는 간단한 방법입니다.
' Load document from HTTP response.
Dim status As IJsonStatus
Set status = document.load("http://postman-echo.com/get")
이를 통해 복잡한 HTTP JSON 요청을 생성하고 JSON 응답을 구문 분석할 수 있습니다.
' Create and fill a new document model object.
Dim model As SomeDocumentModel
Set model = New SomeDocumentModel
model.a = True
model.b = 123
Set model.c = New EmptyDocumentModel
model.d = Array("abc")
' Load JSON data from a document model object.
document.load model
Dim request As String
' Specify HTTP method explicitly.
request = "json://{" + _
"""method"" : ""PUT"","
' Add custom HTTP query parameters.
request = request + _
"""query"" : {" + _
"""a"" : ""#a""," + _
"""b"" : ""#b""," + _
"""c"" : ""#c""" + _
"},"
' Add custom HTTP form data parameters.
request = request + _
"""form"" : {" + _
"""d"" : ""#d""," + _
"""e"" : ""#e""," + _
"""f"" : ""#f""" + _
"},"
' Add custom HTTP headers.
request = request + _
"""form"" : {" + _
"""a"" : ""#1""," + _
"""b"" : ""#2""," + _
"""c"" : ""#3""" + _
"},"
' Override default TCP timeouts.
request = request + _
"""timeouts"" : {" + _
"""connect"" : 5000," + _
"""resolve"" : 5000," + _
"""send"" : 5000," + _
"""receive"" : 5000" + _
"},"
' Require response JSON document to contains HTTP response status code,
' HTTP response headers and HTTP response body nested as JSON.
request = request + _
"""response"" : {" + _
"""status"" : true," + _
"""headers"" : true," + _
"""body"" : ""json""" + _
"}" + _
"}"
' Save JSON document to the specified endpoint as HTTP PUT request
' that is encoded in UTF-8.
Dim status As IJsonStatus
Set status = document.save("http://postman-echo.com/put", "utf-8", request)
' Print JSON data of the parsed JSON response
Debug.Print status.response.json
마지막으로 JSON Schema를 만들고 JSON 문서 검증을 수행하는 방법은 다음과 같습니다.
' Create schema JSON document object.
Dim schemaDoc As JsonDocument
Set schemaDoc = New JsonDocument
' Load JSON schema that requires a node to be an array of numeric values.
schemaDoc.parse _
"{" + _
"""$id"": ""json:numeric_array""," + _
"""type"": ""array""," + _
"""items"": {" + _
"""type"": ""number""" + _
"}" + _
"}"
' Create schema collection and add the schema document to it.
Dim schemas As JsonSchemas
Set schemas = New JsonSchemas
Dim schema As IJsonSchema
Set schema = schemas.Add(schemaDoc, "json:numeric_array")
' Create JSON document object.
Dim instanceDoc As JsonDocument
Set instanceDoc = New JsonDocument
' Load JSON, an array of numeric values that is expected to
' satisfy schema requirements.
instanceDoc.load Array(0, 1, 2)
' Validate JSON instance document against the added schema.
Dim status As IJsonStatus
Set status = schema.validate(instanceDoc)
' Ensure the validation passed successfully.
Debug.Print IIf(status.success, "Validated", "Not-validated")
JSON 해석의 JavaScript 기능을 사용하여 ScriptControl 위에 파서를 작성하여 JSON 내의 모든 데이터 포인트를 나열할 수 있습니다.데이터 구조가 아무리 중첩되거나 복잡하더라도 유효한 JSON을 제공하는 한 이 파서는 완전한 트리 구조를 반환합니다.
JavaScript의 Eval, getKeys 및 getProperty 메서드는 JSON을 검증하고 읽기 위한 구성 요소를 제공합니다.
VBA의 재귀 함수와 함께 JSON 문자열의 모든 키(n번째 수준까지)를 반복할 수 있습니다.그런 다음 트리 컨트롤(이 문서에서 사용됨)이나 사전 또는 간단한 워크시트를 사용하여 필요에 따라 JSON 데이터를 정렬할 수 있습니다.
완전한 VBA 코드는 이쪽입니다.JSON 해석의 JavaScript 기능을 사용하여 ScriptControl 위에 파서를 작성하여 JSON 내의 모든 데이터 포인트를 나열할 수 있습니다.데이터 구조가 아무리 중첩되거나 복잡하더라도 유효한 JSON을 제공하는 한 이 파서는 완전한 트리 구조를 반환합니다.
JavaScript의 Eval, getKeys 및 getProperty 메서드는 JSON을 검증하고 읽기 위한 구성 요소를 제공합니다.
VBA의 재귀 함수와 함께 JSON 문자열의 모든 키(n번째 수준까지)를 반복할 수 있습니다.그런 다음 트리 컨트롤(이 문서에서 사용됨)이나 사전 또는 간단한 워크시트를 사용하여 필요에 따라 JSON 데이터를 정렬할 수 있습니다.
EXCEL 셀의 공식
=JSON2("{mykey:1111, mykey2:{keyinternal1:22.1,keyinternal2:22.2}, mykey3:3333}", "mykey2", "keyinternal2")
디스플레이: 22.2
=JSON("{mykey:1111,mykey2:2222,mykey3:3333}", "mykey2")
디스플레이: 2222
- 순서:
- 1단계. ALT+F11을 누릅니다.
- 스텝 2. 모듈 삽입 ->
- 스텝 3. 도구 -> 참조 -> Microsoft Script Control 1.0 체크 표시
- 4단계. 아래에 붙여넣습니다.
- 5단계. ALT+Q VBA 창을 닫습니다.
도구 -> 레퍼런스 -> Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\mscript.ocx
Public Function JSON(sJsonString As String, Key As String) As String
On Error GoTo err_handler
Dim oScriptEngine As ScriptControl
Set oScriptEngine = New ScriptControl
oScriptEngine.Language = "JScript"
Dim objJSON As Object
Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")")
JSON = VBA.CallByName(objJSON, Key, VbGet)
Err_Exit:
Exit Function
err_handler:
JSON = "Error: " & Err.Description
Resume Err_Exit
End Function
Public Function JSON2(sJsonString As String, Key1 As String, Key2 As String) As String
On Error GoTo err_handler
Dim oScriptEngine As ScriptControl
Set oScriptEngine = New ScriptControl
oScriptEngine.Language = "JScript"
Dim objJSON As Object
Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")")
JSON2 = VBA.CallByName(VBA.CallByName(objJSON, Key1, VbGet), Key2, VbGet)
Err_Exit:
Exit Function
err_handler:
JSON2 = "Error: " & Err.Description
Resume Err_Exit
End Function
vb6 예제 코드입니다. 테스트 완료, 작업 완료
위의 좋은 예에서 나는 변화를 주었고 좋은 결과를 얻었다.
키 {} 및 어레이 []를 읽을 수 있습니다.
Option Explicit
'in vb6 click "Tools"->"References" then
'check the box "Microsoft Script Control 1.0";
Dim oScriptEngine As New ScriptControl
Dim objJSON As Object
''to use it
Private Sub Command1_Click()
Dim json$
json="{'key1': 'value1' ,'key2': { 'key3': 'value3' } }"
MsgBox JsonGet("key1", json) 'result = value1
json="{'key1': 'value1' ,'key2': { 'key3': 'value3' } }"
MsgBox JsonGet("key2.key3",json ) 'result = value3
json="{'result':[{'Bid':0.00004718,'Ask':0.00004799}]}"
MsgBox JsonGet("result.0.Ask", json) 'result = 0.00004799
json="{key1:1111, key2:{k1: 2222 , k2: 3333}, key3:4444}"
MsgBox JsonGet("key2.k1", json) 'result = 2222
json="{'usd_rur':{'bids':[[1111,2222],[3333,4444]]}}"
MsgBox JsonGet("usd_rur.bids.0.0", json) 'result = 1111
MsgBox JsonGet("usd_rur.bids.0.1", json) 'result = 2222
MsgBox JsonGet("usd_rur.bids.1.0", json) 'result = 3333
MsgBox JsonGet("usd_rur.bids.1.1", json) 'result = 4444
End Sub
Public Function JsonGet(eKey$, eJsonString$, Optional eDlim$ = ".") As String
Dim tmp$()
Static sJsonString$
On Error GoTo err
If Trim(eKey$) = "" Or Trim(eJsonString$) = "" Then Exit Function
If sJsonString <> eJsonString Then
sJsonString = eJsonString
oScriptEngine.Language = "JScript"
Set objJSON = oScriptEngine.Eval("(" + eJsonString + ")")
End If
tmp = Split(eKey, eDlim)
If UBound(tmp) = 0 Then JsonGet = VBA.CallByName(objJSON, eKey, VbGet): Exit Function
Dim i&, o As Object
Set o = objJSON
For i = 0 To UBound(tmp) - 1
Set o = VBA.CallByName(o, tmp(i), VbGet)
Next i
JsonGet = VBA.CallByName(o, tmp(i), VbGet)
Set o = Nothing
err: 'if key not found, result = "" empty string
End Function
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set objJSON = Nothing
Set oScriptEngine = Nothing
End Sub
다음으로 새로운 예를 제시하겠습니다.[ VB6 / VBA ]JSON을 내장 VBA로 해석합니다.JSON Path를 지원하는 컬렉션
단일 자체 완결 모듈(클래스 없음)로, JSON을 중첩된 내장 컬렉션(고속 및 린)으로 해석하고 JSON 경로(JSON의 경우 XPath라고도 함)의 실용적인 서브셋을 지원하여 값을 가져옵니다.
은 미친 듯이 둥지를 틀 것을 한다.Item
, 예를 들어 ''' 같은 콜
oJson.Item("first").Item("second").Item("array").Item(0)`
. . 단, 네스트된 값에 액세스하려면 , 1 개의 콜을 사용하고,
JsonValue(oJson, "$.first.second.array[0]")
필요한 경우 계층 내 깊은 곳에서 데이터를 가져옵니다.
언급URL : https://stackoverflow.com/questions/2782076/is-there-a-json-parser-for-vb6-vba
'source' 카테고리의 다른 글
정의되지 않은 jasmine test failed는 함수가 아닙니다($discounting).$$checkUrlChange() (0) | 2023.03.17 |
---|---|
"proposal-numeric-separator" 플러그인을 찾을 수 없습니다. (0) | 2023.03.17 |
소품에서 일치 개체를 참조하려면 어떤 TypeScript 유형을 사용해야 합니까? (0) | 2023.03.17 |
ORA-28001:암호가 만료되었습니다. (0) | 2023.03.17 |
ng-repeat 추적 기준 및 필터 및 순서 미작동 (0) | 2023.03.17 |