0

I'm attempting to loop through a JArray and I'm getting msg is not declared error inside my for/next loop.

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
      }
    ]}

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

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?

s15199d
  • 7,261
  • 11
  • 43
  • 70

1 Answers1

1

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

Update

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.

Change:

Dim threadID As JToken = msg("thread_ID")

To:

Dim threadID As JToken = msg("thread_id")

and it should work.

Brian Rogers
  • 125,747
  • 31
  • 299
  • 300
  • Thanks @BrianRogers. thread_ID is potentially null which is why i wasn't casting it. Later in my code after I check if it's null, I covert it using CInt(threadID). But, my problem is before that...i'm getting msg is not declared. Without msg there is no thread_ID. – s15199d Oct 02 '17 at 19:05
  • What is the actual text of the message you are getting? `msg` is most definitely declared in your code-- it's right there in your `For Each` loop. Is `msg` itself actually null? Maybe you just need a null check on that inside the `For Each` loop? – Brian Rogers Oct 02 '17 at 19:52
  • I appreciate the effort! It never passes the If Not threadID is nothing test. Aka every time threadID is "nothing". Which I should point out is not the case. – s15199d Oct 02 '17 at 20:46
  • Can you show the actual JSON you are trying to read? The extremely abbreviated snip of JSON you show in your question does not contain a `thread_ID` value at all; it just has `id`. (If the JSON is too big to include in the question, can you whittle it down to an example that reproduces the issue and then include that?) – Brian Rogers Oct 02 '17 at 21:01
  • I expanded the sample JSON. I had to anonymize the data, but the structure is legit. – s15199d Oct 03 '17 at 12:18