JSON.net is an incredibly horrible library to parse through arrays. JArray.parse is one way JSON data can be parsed, but it cannot be accessed in a manner which other programming languages, like javascript can.
Here's JSON code from a project I'm currently working on:
{"game": {"turn": 0, "state": [["s9", "h0", "c10", "d11", "s4", "0"], ["s7", "s1", "d2", "c3", "s10", "0"]]}}
It's valid JSON, you can check it for yourself here: http://jsonlint.com/
The hierarchy is like this:
- Game
- Turn
- State
- Array
- Array
Grabbing the data from Game and Turn is basic, handled using JObject:
JObject.Parse(JObject.Parse(tempts).SelectToken("game").ToString()).SelectToken("turn")
However, the luxury of using SelectToken is not available with JArray
Any attempt to access it as an array will fail, that's where this error message comes from: Additional information: Accessed JArray values with invalid key value: "0". Array position index expected
So you can access it like this:
Dim game2 = JObject.Parse(JObject.Parse(tempts).SelectToken("game").ToString()).SelectToken("state") MsgBox(game2(0)(0))
And hopefully get "s9" as your output..
When it comes to dynamic variables in a loop however:
Additional information: Accessed JArray values with invalid key value: 0. Array position index expected.
For i = 0 To Val(1)
Dim game2 = JObject.Parse(JObject.Parse(tempts).SelectToken("game").ToString()).SelectToken("state")
MsgBox(game2(i)(0))
Next
Additional information: Accessed JArray values with invalid key value: 0. Array position index expected.
This is because JArray does not accept the loop's value as "Val"
For i = 0 To 1 Dim game2 = JObject.Parse(JObject.Parse(tempts).SelectToken("game").ToString()).SelectToken("state") MsgBox(game2(i)(0)) Next
Will work as intended, where Val(1) is replaced with "1" or even Int(1)
However if you need to use Val, then here's a hacky solution for that..
Dim pIndexed = 0 For Each token In game If pIndexed = p Then Dim iIndexed = 0 For Each token2 In token If iIndexed = i Then currentValu = token2.ToString Else End If iIndexed = iIndexed + 1 Next Else End If pIndexed = pIndexed + 1 Next