如何从嵌套在 json 数组中的对象访问数据

How to access data from objects nested in json array

我需要访问嵌套的 json 对象数组中的数据以便能够进一步操作它,使用 vb.net 4.0 中的 javascriptserializer。

示例字符串如下:

json: {"multicast_id":216,"success":3,"failure":3,"canonical_ids":1,"results":[{"message_id":"1:0408"},{"errord":"Unavailable"}]}

这是我到目前为止编写的代码:

Class main
Public Property multicast_id As Integer
Public Property success As Integer
Public Property failure As Integer
Public Property canonical_ids As Integer
Public Property results As Results()
End Class

Class Results
Public Property message_id As String
Public Property errord As String
End Class


Public Class Form1

Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click
    Dim json As String
    json = txtInsert.Text

    Try
        Dim ser As JavaScriptSerializer = New JavaScriptSerializer()
        Dim exmp As main = New main
        exmp = ser.Deserialize(Of main)(json)

        Console.WriteLine(exmp.canonical_ids)
        Console.WriteLine(exmp.multicast_id)

        For Each item As Object In exmp.results
            For Each example As String In item
                Console.WriteLine("example")
            Next
        Next

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub
End Class

我在每个语句的内部都遇到了错误。如果有人能帮我解决这个问题,我将不胜感激。

您不需要内部的 For Each。您已经在第一个循环中旋转数组。您也可以更具体地指定循环中的类型:

    For Each item As Results In exmp.results
        Console.WriteLine(item.message_id & " : " & item.errord)
    Next

您正在正确获取嵌套对象。

相反,您的问题是,一旦您获得该嵌套对象,您就会尝试使用 For Each 来获取该结果的每个字符串 属性。那是无效的。

例如,这不起作用,因为 Results 没有实现 IEnumerable,所以您不能在 in:

上使用 For Each
Dim r as new Results();
r.message_id = "1:0408"
r.errord = "Unavailable"
For Each example As String In r ' <- this will throw an error
Next

一旦您获得了对 Results 的引用,您就需要通过 属性 名称访问它:

For Each item As Results In exmp.results
    Console.WriteLine("message_id: {0}", item.message_id)
    Console.WriteLine("errord: {0}", item.errord)
Next

如果您需要按名称访问属性,请将结果更改为不同的类型。

例如,您可以将结果定义为 Dictionary(of String, Object) 的数组,如下所示:

Class main
    Public Property multicast_id As Integer
    Public Property success As Integer
    Public Property failure As Integer
    Public Property canonical_ids As Integer
    Public Property results As Dictionary(Of String, Object)()
End Class

那么你可以使用:

For Each item As Object In exmp.results 'item will be a Dictionary(Of String, Object)
    For Each example As Object In item ' example will be a KeyValuePari(Of String, Object)
        Console.WriteLine(example.key)
        Console.WriteLine(example.value)
    Next
Next

或这样的名字:

    For Each item As Object In exmp.results 'item will be a Dictionary(Of String, Object)
        Console.WriteLine(item("message_id"))
        Console.WriteLine(item("errord"))
    Next
Next