2013-10-14 70 views
11

我有一個JSON象下面這樣:如何使用VBA解析JSON而無需外部庫?

{"sentences":[{"trans":"something ru","orig":"english word","translit":"Angliyskoye slovo","src_translit":""}], "src":"en","server_time":69} 

,並對其進行分析:

Function jsonDecode(jsonString As Variant) 
    Set sc = CreateObject("ScriptControl"): sc.Language = "JScript" 
    Set jsonDecode = sc.Eval("(" + jsonString + ")") 
End Function 

Set arr = jsonDecode(txt) 

在結果arr包含的值象下面這樣(在手錶選中):

arr 
- sentences (type: Variant/Object/JScriptTypeInfo) 
    - 0 (type: Variant/Object/JScriptTypeInfo) 
    - orig (type: Variant/String) 
    - trans (type: Variant/String) 
    ... 
    - Item 1 (type: Variant/Object/JScriptTypeInfo) 
    - orig (type: Variant/String) 
    - trans (type: Variant/String) 
    ... 
- server_time 
- src 

arr.src效果很好,但是我怎樣才能得到arr.sentences(0).trans?首先,VBA用Sentences代替sentences,其次(當我試圖手動更改json時),它仍然不允許使用sentenses(0)

+1

可能重複http://stackoverflow.com/questions/6627652/parsing-json-in-excel-vba)看看[第一個答案](http://stackoverflow.com/a/7300926/1316573) –

+0

[用**示例文件**解析使用VBA的JSON] (http://stackoverflow.com/questions/16817545/handle-json-object-in-xmlhttp-response-in-excel-vba-code/16851758#16851758) – Santosh

+2

@DanielCook,我的Excel 2010的doe不會從該答案中識別ScriptControl。 –

回答

-3

在上面的例子中 - 用(和)替換[和]似乎工作。儘管這不再是嚴格的JSON格式。

然後用arr.sentences.trans

引用它請注意,我改變了我的給sentences2的句子,似乎是保留了一個內置的屬性。

1

使用JavaScript功能解析JSON,在ScriptControl之上,我們可以在VBA中創建一個解析器,它將列出JSON中的每個數據點。無論數據結構如何嵌套或複雜,只要我們提供有效的JSON,此解析器將返回完整的樹結構。

JavaScript的Eval,getKeys和getProperty方法爲驗證和讀取JSON提供構建塊。

再加上VBA中的遞歸函數,我們可以遍歷JSON字符串中的所有關鍵字(達到第n個關卡)。然後使用一個Tree控件(在本文中使用)或一個字典,甚至是一個簡單的工作表,我們可以根據需要安排JSON數據。

全部代碼在這裏:JSON Parser in VBA

7

我發現有用此腳本示例(從http://www.mrexcel.com/forum/excel-questions/898899-json-api-excel.html#post4332075):

Sub getData() 

    Dim Movie As Object 
    Dim scriptControl As Object 

    Set scriptControl = CreateObject("MSScriptControl.ScriptControl") 
    scriptControl.Language = "JScript" 

    With CreateObject("MSXML2.XMLHTTP") 
     .Open "GET", "http://www.omdbapi.com/?t=frozen&y=&plot=short&r=json", False 
     .send 
     Set Movie = scriptControl.Eval("(" + .responsetext + ")") 
     .abort 
     With Sheets(2) 
      .Cells(1, 1).Value = Movie.Title 
      .Cells(1, 2).Value = Movie.Year 
      .Cells(1, 3).Value = Movie.Rated 
      .Cells(1, 4).Value = Movie.Released 
      .Cells(1, 5).Value = Movie.Runtime 
      .Cells(1, 6).Value = Movie.Director 
      .Cells(1, 7).Value = Movie.Writer 
      .Cells(1, 8).Value = Movie.Actors 
      .Cells(1, 9).Value = Movie.Plot 
      .Cells(1, 10).Value = Movie.Language 
      .Cells(1, 11).Value = Movie.Country 
      .Cells(1, 12).Value = Movie.imdbRating 
     End With 
    End With 

End Sub 
[解析JSON在Excel VBA(的