在Visual Basic中使用json.net解析嵌套的JSON

时间:2012-11-16 12:21:32

标签: vb.net json json.net

我有嵌套的JSON字符串,我想从下面解析出适当的值。由于我正在学习,我正在努力一点,我的第一部分工作,我可以解析单个JSON字符串,并使用下面的代码示例1返回适当的值,但是我坚持使用JSON字符串有问题的是它是嵌套的,所以同样的方法不起作用

{
  "jsonrpc":"2.0",
  "method":"Player.OnPause",
  "params":{
     "data": { "item": { "id":29, "type":"episode" },
               "player": { "playerid":1, "speed":0 }
             },
     "sender":"xbmc"
  }
}

代码......

    Dim JSON As String
    Dim values As Newtonsoft.Json.Linq.JObject
    JSON = JSON STRING WOULD GO HERE, COMES from TCP IP STREAM
    values = JObject.Parse(JSON)
    Console.WriteLine(values.GetValue("method"))

使用该示例我可以从第一级JSON字符串中提取方法键(例如Player.OnPause),但是如何从第二级和第三级字符串中提取数据,例如在上面的字符串中,能够获取数据级JSON值和项级JSON值。这可能与上述类似吗?

欣赏您可以提供的任何提示,我是一个示例人员,但只是努力应用一些东西来读取多个嵌套的JSON字符串或多个级别。毫无疑问,这将是一件很容易让我失踪的事情,但我很欣赏有人能提供的任何帮助。

谢谢

2 个答案:

答案 0 :(得分:5)

    Dim jsonstring = IO.File.ReadAllText("json.txt")
    Dim jo = Json.Linq.JObject.Parse(jsonstring)
    Dim playerid = jo("params")("data")("player")("playerid")
你是说这样的意思吗? “json.txt”只包含您的JSON字符串。

答案 1 :(得分:4)

在这里搜索之后,对于将javascript对象表示法解析为.net字典的多态示例,我放弃并编写了自己的。希望有人觉得这很有用;)

Public Class jsonDictionary
    Inherits Dictionary(Of String, Object)

#Region "Public Properties"
    Private _parent As jsonDictionary
    Public ReadOnly Property Parent() As jsonDictionary
        Get
            Return _parent
        End Get
    End Property

#End Region

#Region "Initialisation and Finalisation"

    Public Sub New(ByVal Parent As jsonDictionary, ByVal strJson As String)
        _parent = Parent
        For Each Element As String In SplitJSON(CharTrim(strJson))
            Dim elName As String = CharTrim(Element.Split(":")(0).Trim)
            Select Case Element.Split(":")(1).Trim.Substring(0, 1)
                Case "{"
                    Me.Add(elName, New jsonDictionary(Me, Element.Substring(InStr(Element, ":"))))
                Case "["
                    Dim ElArray As New List(Of jsonDictionary)
                    For Each ArrayElement As String In SplitJSON(CharTrim(Element.Substring(InStr(Element, ":"))))
                        ElArray.Add(New jsonDictionary(Me, ArrayElement))
                    Next
                    Me.Add(elName, ElArray)
                Case Else
                    Me.Add(elName, Element.Split(":")(1).Trim)
            End Select

        Next
    End Sub

#End Region

#Region "Private Methods"

    Public Shared Function CharTrim(ByVal Str As String) As String
        Return Str.Trim.Substring(1, Str.Length - 2)
    End Function

    Private Function SplitJSON(ByVal str As String) As String()

        Dim ret() As String = Nothing
        Dim sqCount As Integer = 0
        Dim clCount As Integer = 0
        Dim buildStr As New System.Text.StringBuilder

        For i As Integer = 0 To str.Length - 1
            Select Case str.Substring(i, 1)
                Case ","
                    If sqCount = 0 And clCount = 0 Then
                        Try
                            ReDim Preserve ret(UBound(ret) + 1)
                        Catch ex As Exception
                            ReDim ret(0)
                        Finally
                            ret(UBound(ret)) = buildStr.ToString
                            buildStr = New System.Text.StringBuilder
                        End Try
                    Else
                        buildStr.Append(str.Substring(i, 1))
                    End If
                Case Else
                    buildStr.Append(str.Substring(i, 1))
                    Select Case str.Substring(i, 1)
                        Case "["
                            sqCount += 1
                        Case "]"
                            sqCount -= 1
                        Case "{"
                            clCount += 1
                        Case "}"
                            clCount -= 1

                    End Select
            End Select
        Next
        If buildStr.ToString.Length > 0 Then
            Try
                ReDim Preserve ret(UBound(ret) + 1)
            Catch ex As Exception
                ReDim ret(0)
            Finally
                ret(UBound(ret)) = buildStr.ToString
            End Try
        End If
        Return ret

    End Function

#End Region

End Class