Home > Blockchain >  'The node must be of type 'JsonObject'.'
'The node must be of type 'JsonObject'.'

Time:02-14

I'm trying to parse this Json

With the code:

 Dim streamData As Stream = Nothing
        Using http As New HttpClient
            Dim url As String = "https://api.hotbit.io/api/v1/market.deals?market=KIBA/USDT&limit=150&last_id=1521100930&api_key=44812d8f-66d3-01c0-94c3b29305040b03&sign=98EEC3D69D3F70F9BDFED901984B2AA4"

            Dim t As Task(Of Stream) = http.GetStreamAsync(url)
            streamData = t.Result
        End Using

        Dim jsonResponse As JsonNode = JsonNode.Parse(streamData)
        Dim result As JsonObject = jsonResponse("result").AsObject
        Dim c As String = String.Empty
        For Each kvp In result.AsEnumerable
            c &= kvp.Value("price").ToString & vbCr
        Next
        RichTextBox1.Text = c
    End Sub

but I keep getting the error at debug

The node must be of type 'JsonObject'.' on the line

 Dim result As JsonObject = jsonResponse("result").AsObject

How it comes it gives an error If I'm already trying to parse it as a Jsonobject?

Thanks

CodePudding user response:

Give a go at this..

  • Paste this into a new class file:
Namespace HotBit
    Partial Public Class TradeCollection
        <JsonProperty("error")>
        Public Property [Error] As Object
        <JsonProperty("result")>
        Public Property Result As List(Of Result)
        <JsonProperty("id")>
        Public Property Id As Long
    End Class

    Partial Public Class Result
        <JsonProperty("id")>
        Public Property Id As Long
        <JsonProperty("time")>
        Public Property Time As Long
        <JsonProperty("price")>
        Public Property Price As String
        <JsonProperty("amount")>
        <JsonConverter(GetType(ParseStringConverter))>
        Public Property Amount As Long
        <JsonProperty("type")>
        Public Property Type As TypeEnum
    End Class

    Public Enum TypeEnum
        Buy
        Sell
    End Enum

    Partial Public Class TradeCollection
        Public Shared Function FromJson(ByVal json As String) As TradeCollection
            Return JsonConvert.DeserializeObject(Of TradeCollection)(json, Settings)
        End Function
    End Class

    Public Module Serialize
        <Extension()>
        Public Function ToJson(ByVal self As TradeCollection) As String
            Return JsonConvert.SerializeObject(self, Settings)
        End Function
    End Module

    Friend Module Converter
        Public ReadOnly Settings As JsonSerializerSettings = New JsonSerializerSettings With {
            .MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            .DateParseHandling = DateParseHandling.None
        }
    End Module

    Friend Class ParseStringConverter
        Inherits JsonConverter

        Public Overrides Function CanConvert(ByVal t As Type) As Boolean
            Return t Is GetType(Long) OrElse t Is GetType(Long?)
        End Function

        Public Overrides Function ReadJson(ByVal reader As JsonReader, ByVal t As Type, ByVal existingValue As Object, ByVal serializer As JsonSerializer) As Object
            If reader.TokenType = JsonToken.Null Then Return Nothing
            Dim value = serializer.Deserialize(Of String)(reader)
            Dim l As Long

            If Long.TryParse(value, l) Then
                Return l
            End If

            Throw New Exception("Cannot unmarshal type long")
        End Function

        Public Overrides Sub WriteJson(ByVal writer As JsonWriter, ByVal untypedValue As Object, ByVal serializer As JsonSerializer)
            If untypedValue Is Nothing Then
                serializer.Serialize(writer, Nothing)
                Return
            End If

            Dim value = CLng(untypedValue)
            serializer.Serialize(writer, value.ToString())
            Return
        End Sub

        Public Shared ReadOnly Singleton As ParseStringConverter = New ParseStringConverter()
    End Class

    Friend Class TypeEnumConverter
        Inherits JsonConverter

        Public Overrides Function CanConvert(ByVal t As Type) As Boolean
            Return t Is GetType(TypeEnum) OrElse t Is GetType(TypeEnum?)
        End Function

        Public Overrides Function ReadJson(ByVal reader As JsonReader, ByVal t As Type, ByVal existingValue As Object, ByVal serializer As JsonSerializer) As Object
            If reader.TokenType = JsonToken.Null Then Return Nothing
            Dim value = serializer.Deserialize(Of String)(reader)

            Select Case value
                Case "buy"
                    Return TypeEnum.Buy
                Case "sell"
                    Return TypeEnum.Sell
            End Select

            Throw New Exception("Cannot unmarshal type TypeEnum")
        End Function

        Public Overrides Sub WriteJson(ByVal writer As JsonWriter, ByVal untypedValue As Object, ByVal serializer As JsonSerializer)
            If untypedValue Is Nothing Then
                serializer.Serialize(writer, Nothing)
                Return
            End If

            Dim value = CType(untypedValue, TypeEnum)

            Select Case value
                Case TypeEnum.Buy
                    serializer.Serialize(writer, "buy")
                    Return
                Case TypeEnum.Sell
                    serializer.Serialize(writer, "sell")
                    Return
            End Select

            Throw New Exception("Cannot marshal type TypeEnum")
        End Sub

        Public Shared ReadOnly Singleton As TypeEnumConverter = New TypeEnumConverter()
    End Class
End Namespace


  • Then install Newtonsoft (if not already) and Imports it

  • Then Imports HotBit (or if you changed the Namespace of the "paste this" above, Imports that new namespace

  • Then do your request and query the result e.g.:

Sub Main(args As String())

        Dim s = New WebClient().DownloadString("https://api.hotbit.io/api/v1/market.deals?market=KIBA/USDT&limit=150&last_id=1521100930&api_key=44812d8f-66d3-01c0-94c3b29305040b03&sign=98EEC3D69D3F70F9BDFED901984B2AA4")

        Dim tc = TradeCollection.FromJson(s)

        Dim prices = String.Join(","c, tc.Result.Select(Function(r) r.Price))

    End Sub
  • Related