2017-07-14 10 views
1

これは私がこれまでに他の有用なスタックのポストから持って迅速かつ汚いPOCです:ウェブAPIから解析JSON/XMLパラメータ

Public Function WebRequest(url As String) As String 
    Dim http As MSXML2.xmlhttp 
    Set http = CreateObject("MSXML2.ServerXMLHTTP") 

    http.open "GET", url, False 
    http.send 

    WebRequest = http.responseText 
    Set http = Nothing 
End Function 

Private Sub Command1_Click() 

Dim http As MSXML2.xmlhttp 
    Dim result As String 
    Dim url As String 
    Dim productId As String 

    productId = "2" 
    url = "http://localhost:1111/api/products/" & productId 
    result = WebRequest(url) 

    MsgBox result 

End Sub 

予想通りこれは、シンプルなWeb APIとリターンを呼び出します。応答は次のようになります。

{"Id":2,"Name":"Yo-yo","Category":"Toys","Price":3.75} 

残りのアプリケーションで使用するためのパラメータを変数に割り当てる最もよい方法は何ですか?

+0

ここで 'New'の代わりに' CreateObject() 'を使うのはなぜですか? – Bob77

+0

@ Bob77私は非常に迅速にこの答えをコピーしました:https://stackoverflow.com/a/27854657/7896203私は正直であるためにその質問に答えることができない前にVB6で働いたことがない。 – Reed

答えて

2

JSONを解析するのに「最適な」方法はありませんが、そのための既存のVB6クラスがいくつかあります。 VB6やWindowsには何も組み込まれていないので、最初に手を差し伸べる明確な選択肢はありません。

既存のVB6クラスまたはサードパーティのライブラリを使用しない場合は、独自のコードで解析するだけで "手動で"行うことができます。あなたが望むJSONがかなりシンプルであれば、あなたが必要とするすべてのものになるかもしれません。

ここに多くの落とし穴が、それは限り、他のデータ型が使用されていないとして、文字列は引用符やエスケープ記号を持っていることはありません、あなたは非常に単純なケースのために働く、等:

Option Explicit 

Private Sub Main() 
    Const SIMPLE_JSON As String = _ 
     "{""Id"":2,""Name"":""Yo-yo"",""Category"":""Toys"",""Price"":3.75}" 
    Dim JsonItems() As String 
    Dim Collection As Collection 
    Dim I As Long 
    Dim Parts() As String 
    Dim Value As Variant 

    JsonItems = Split(Mid$(SIMPLE_JSON, 2, Len(SIMPLE_JSON) - 2), ",") 
    Set Collection = New Collection 
    For I = 0 To UBound(JsonItems) 
     Parts = Split(JsonItems(I), ":") 
     Parts(0) = Mid$(Parts(0), 2, Len(Parts(0)) - 2) 
     If Left$(Parts(1), 1) = """" Then 
      Value = Mid$(Parts(1), 2, Len(Parts(1)) - 2) 
     Else 
      Value = Val(Parts(1)) 
     End If 
     Collection.Add Array(Parts(0), Value), Parts(0) 
    Next 

    With Collection 
     For I = 1 To .Count 
      Debug.Print .Item(I)(0); "="; .Item(I)(1) 
     Next 
    End With 
End Sub 

結果:

Id= 2 
Name=Yo-yo 
Category=Toys 
Price= 3.75 

ロケールがブラインド(常に不変のロケールを使用するため、JSON番号は常にフォーマットする必要があります)であるため、文字列以外の値には関数が使用されます。

+0

助けてくれてありがとう!私はそれがあまり真っ直ぐではないだろうと思ったが、これはこれまでのところ私の最高のリソースです!私は、レガシーサービスでどのデータタイプが使用されているかをさらに調べなければなりません。ありがとう! – Reed