问题描述
我正在尝试遍历JArray,并且在for/next循环内未将msg声明为错误.
I'm attempting to loop through a JArray and I'm getting msg is not declared error inside my for/next loop.
我的JSON格式如下...
My JSON is formatted like this...
{ "messages":[
{
"id": 123456789,
"sender_id": 1236547890,
"replied_to_id": null,
"created_at": "2017/09/28 15:49:20 +0000",
"network_id": 554477,
"message_type": "update",
"sender_type": "user",
"url": "https://www.example.com",
"web_url": "https://www.example.com/123456789",
"group_id": 7418529,
"body": {
"urls": [
"https://www.facebook.com/blah/blah/blah",
"https://google.com/foo/bar"
],
"parsed": "Sem, imperdiet voluptatibus. Molestias, gravida vehicula, irure suscipit. Dis facilisi laudantium recusandae necessitatibus dolor quaerat quisque! Lectus deserunt taciti magnis, a non eligendi similique? Exercitationem eius corporis. Faucibus eiusmod delectus voluptatum nascetur, alias doloremque sagittis, repellendus laudantium quae, iaculis, cras maecenas fusce suspendisse amet magnam nulla gravida mollis, tempora gravida",
"plain": "Sem, imperdiet voluptatibus. Molestias, gravida vehicula, irure suscipit. Dis facilisi laudantium recusandae necessitatibus dolor quaerat quisque! Lectus deserunt taciti magnis, a non eligendi similique? Exercitationem eius corporis. Faucibus eiusmod delectus voluptatum nascetur, alias doloremque sagittis, repellendus laudantium quae, iaculis, cras maecenas fusce suspendisse amet magnam nulla gravida mollis, tempora gravida",
"rich": "Sem, imperdiet voluptatibus. Molestias, gravida vehicula, irure suscipit. Dis facilisi laudantium recusandae necessitatibus dolor quaerat quisque! Lectus deserunt taciti magnis, a non eligendi similique? Exercitationem eius corporis. Faucibus eiusmod delectus voluptatum nascetur, alias doloremque sagittis, repellendus laudantium quae, iaculis, cras maecenas fusce suspendisse amet magnam nulla gravida mollis, tempora gravida"
},
"thread_id": 956818730,
"client_type": "Zapier",
"client_url": "https://zapier.com/zapbook/example/",
"system_message": false,
"direct_message": false,
"chat_client_sequence": null,
"language": "en",
"notified_user_ids": [],
"privacy": "public",
"attachments": [],
"liked_by": {
"count": 0,
"names": []
},
"content_excerpt": "Sem, imperdiet voluptatibus. Molestias, gravida vehicula, irure suscipit. Dis facilisi laudantium recusandae necessitatibus dolor quaerat quisque! Lectus deserunt taciti magnis, a non eligendi similique? Exercitationem eius corporis. Faucibus eiusmod delectus voluptatum nascetur, alias doloremque sagittis, repellendus laudantium quae, iaculis, cras maecenas fusce suspendisse amet magnam nulla gravida mollis, tempora gravida",
"group_created_id": 7418529
},
{
"id": 987654321,
"sender_id": 3214569870,
"replied_to_id": 123555777,
"created_at": "2017/09/28 15:28:28 +0000",
"network_id": 554477,
"message_type": "update",
"sender_type": "user",
"url": "https://www.example.com",
"web_url": "https://www.example.com/987654321",
"body": {
"parsed": "Veniam quasi sem, neque netus? Eos quae voluptatibus autem optio varius euismod voluptas, voluptatum inventore",
"plain": "Veniam quasi sem, neque netus? Eos quae voluptatibus autem optio varius euismod voluptas, voluptatum inventore",
"rich": "Veniam quasi sem, neque netus? Eos quae voluptatibus autem optio varius euismod voluptas, voluptatum inventore"
},
"thread_id": 956224600,
"client_type": "Web",
"client_url": "https://www.example.com/",
"system_message": false,
"direct_message": false,
"chat_client_sequence": null,
"language": "en",
"notified_user_ids": [],
"privacy": "public",
"attachments": [],
"liked_by": {
"count": 0,
"names": []
},
"content_excerpt": "Veniam quasi sem, neque netus? Eos quae voluptatibus autem optio varius euismod voluptas, voluptatum inventore",
"group_created_id": null
}
]}
这是我试图用来遍历JArray的代码...
Here's the code I'm attempting to use to loop through the JArray...
Dim jObj As JObject = JObject.Parse(File.ReadAllText(outputJSONpath & "myFile.json"))
Dim jArr As JArray = CType(jObj("messages"), JArray)
Dim i As Int32 = 0
For Each msg As JObject In jArr
Dim threadID = msg.GetValue("thread_ID")
'Do Work
Next
当我执行jArr.Count
时,它将返回6,341.为什么没有声明味精?如何获取我的6,341消息中的每一个的thread_ID值?
When I do a jArr.Count
it returns 6,341. Why is msg not declared? How do I get to the value for thread_ID for each of my 6,341 msg?
推荐答案
我不确定您对未声明msg
的意思-最肯定是在您的For Each
循环中声明了它.听起来好像数组中的一个或多个消息项实际上可能是null
或不是JObject
.在尝试使用JToken
之前,您可能需要进行一些防御性的编码,并检查是否为null,以及是否得到的JToken
类型是否符合您的期望.与thread_ID
值类似.也许是这样的:
I'm not sure what you mean about msg
not being declared-- it is most definitely declared right there in your For Each
loop. It sounds like maybe one or more of the message items inside the array might actually be null
or not a JObject
. You might need to code a little more defensively and check for null and also whether the type of JToken
you are getting is what you expect before trying to use it. Similarly with the thread_ID
value. Perhaps something like this instead:
For Each msg As JToken In jArr
If Not msg Is Nothing AndAlso msg.Type = JTokenType.Object Then
Dim threadID As JToken = msg("thread_ID")
If Not threadID Is Nothing AndAlso threadID.Type = JTokenType.Integer Then
Dim id As Integer = CType(threadID, Integer)
'... Do something with id
Console.WriteLine(id)
End If
End If
Next
更新
好的,我知道问题出在哪里.在JToken
上使用GetValue()
或索引器语法(即msg("thread_ID")
)时,属性名称区分大小写.在您的代码中,您有thread_ID
,但是在JSON中是thread_id
,因此代码永远找不到它.
OK, I see what the issue is now. When you use GetValue()
or the indexer syntax, i.e. msg("thread_ID")
, on a JToken
, the property name is case sensitive. In your code, you have thread_ID
, but in the JSON it is thread_id
, so the code never finds it.
更改:
Dim threadID As JToken = msg("thread_ID")
收件人:
Dim threadID As JToken = msg("thread_id")
它应该可以工作.
这篇关于通过JArray的NewtonSoft JSON循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!