如何将JSON正确导入Excel

时间:2019-08-22 09:46:42

标签: json excel vba

我的目标是搜索一些数据并将结果返回到excel表中。我正在使用newsapi.org服务,并使用VBA来做到这一点。

我正在将XMLHttpRequest发送到newsapi.org并成功接收到(JSON)响应,我可以将其保存到桌面上的文件中。但是,由于收到运行时错误13:类型不匹配,我无法将该响应导入到excel中。

很奇怪,当我将源更改为其他JSON文件时,它可以工作。例如http://jsonplaceholder.typicode.com/users

所以我假设问题出在我收到的JSON响应类型附近。

Public Sub xmlhttptutorial()

Dim xmlhttp As Object
Dim myurl As String
Dim JSON As Object
Dim myFile As String
Dim i As Integer
Dim ws As Worksheet
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
Set ws = Sheet2
myFile = "C:\Users\A0781525\Desktop\myFile.txt"
myurl = "https://newsapi.org/v2/everything?q=Ashley%20Madison%20Data%20Breach&"
xmlhttp.Open "GET", myurl, False
xmlhttp.Send
Set JSON = JsonConverter.ParseJson(xmlhttp.ResponseText)
Open myFile For Output As #1: Print #1, xmlhttp.ResponseText: Close #1
i = 2
For Each Item In JSON
    Range("A2").Value = Item("articles")("0:")("source")("id:")
    Range("A2").Value = Item("articles")("0:")("source")("name")
    Range("A2").Value = Item("articles")("0:")("title")
i = i + 1
Next
End Sub

中断发生在第: Range("A2").Value = Item("articles")("0:")("source")("id:")

我收到的JSON文件输出示例:

{“ status”:“ ok”,“ totalResults”:16,“ articles”:[{“ source”:{“ id”:“ mashable”,“ name”:“ Mashable”},“ author”: “ Jack Morse”,“ title”:“色情网站泄露了超过一百万用户的私人信息”,“ description”:“关于互联网的伟大之处在于,没有人知道您对无尽色情内容有认真的看法。除非,也就是您拥有帐户的色情网站泄露了您的个人信息。超过一百万的Luscious.net帐户持有人面临着无法解决的问题……“,” url“:” https://mashable.com/article/porn-site-leaks-users-data/“,” urlToImage“:” {{ 3}}“,” publishedAt“:” 2019-08-20T22:36:24Z“,” content“:”关于互联网的伟大之处在于,没有人知道您对无尽色情内容有严肃的看法。除非,也就是说,您拥有一个色情网站的色情网站泄露了您的个人信息。\ r \ n超过100万个Luscious.net帐户持有人面临着这种不正常……[+2840个字符]“}

2 个答案:

答案 0 :(得分:1)

您错误地解析了JSON。可能是由于对它的构造有误解。

尝试类似的东西:

i = 2
'Cells.Clear
For Each item In JSON("articles")
    Cells(i, 1).Value = item("source")("id")
    Cells(i, 2).Value = item("source")("name")
    Cells(i, 3).Value = item("title")
i = i + 1
Next

答案 1 :(得分:1)

问题出在您尝试访问已解析的json元素的方式上。

没有最好的JSON确切结构,我假设您需要做的是这样:

Debug.Print JSON("articles")(1)("source")("id")

访问第一篇文章的ID。

或这个

For Each item In JSON("articles")
Debug.Print item("source")("id")
Next item 

在它们之间循环