Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Deserialise Json ?


Christian

Anbefalte innlegg

Jeg har en Json string som ser ur som følger :

 

{"Name":"HomeSeer Devices","Version":"1.0","Devices":[{"ref":29,"name":"test","location":"Unknown","location2":"Unknown","value":0,"status":"Off","device_type_string":"","last_change":"\/Date(-62135596800000)\/","relationship":0,"hide_from_view":false,"associated_devices":[],"device_type":{"Device_API":0,"Device_API_Description":"No API","Device_Type":0,"Device_Type_Description":"Type 0","Device_SubType":0,"Device_SubType_Description":""},"device_image":"","UserNote":"","UserAccess":"Any","status_image":"/images/HomeSeer/status/off.gif"}]}

Jeg har skrevet følgende script : 

 

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Sub Main (params as Object)

         Dim value As String
         Dim obj As New Object
         Dim url as string
         Dim json as String

        url = "http://192.168.253.8/json?request=getstatus&ref=29"
        json=hs.urlAction(url, "GET","","")


        obj = JsonConvert.DeserializeObject(json)
       value = obj.tostring
       hs.WriteLog ("obj", obj)

        hs.WriteLog("Value of device", value)
       hs.WriteLog ("INFO",json)

end sub 

 

Jeg får feilmelding i loggen, som sier "Running script C:\Program Files (x86)\HomeSeer HS3\scripts\test.vb :Målet forårsaket et unntak under aktivering.Objektreferanse er ikke satt til en objektforekomst." 

 

Mener og tror dette er det samme som "object reference not set to an instance of an object" på engelsk.

 

Noen som har ett godt forslag på hvordan dette kan løses ? 

 

Er det mulig å få alle feilmeldinger i loggen i HS3 ut på engelsk forresten ?

Lenke til kommentar
Del på andre sider

Her kan det ha skjedd ting siden jeg sjekket, men det er ikke nok å bare bruke "Imports". For å øke hurtigheten på script-kompileringen i HS er ikke hele .NET tilgjengelig ut av esken. Du må legge referanser til selv til ScriptingReferences i settings.ini-filen.

 

Se denne tråden her: https://forums.homeseer.com/showthread.php?t=172336

... og nærmere bestemt denne posten: https://forums.homeseer.com/showpost.php?p=1156598&postcount=6

Lenke til kommentar
Del på andre sider

Takk for svar. 

 

Ja, det så jeg, så det er gjort. 

Jeg fant fant sånn halveis ut av det. Fikk scriptet til å fungere dersom jeg spør etter "Name", "Devices" eller "Version". Dersom jeg skal spørre etter noe annet får jeg følgende feilmelding : "cannot access child value on newtonsoft.json.linq.jproperty"

Lenke til kommentar
Del på andre sider

7 minutter siden, Christian skrev:

Dersom jeg skal spørre etter noe annet får jeg følgende feilmelding : "cannot access child value on newtonsoft.json.linq.jproperty"

Hvordan spør du da?

 

Riktignok C#, men du tar tegningen (bare bytt ut klamme-parenteser med vanlige): http://stackoverflow.com/questions/37575123/accessing-child-value-of-json-in-c-sharp

 

Lenke til kommentar
Del på andre sider

Hmmm... problemet er muligens at "Devices" er en liste. Jeg deseraliserer alltid til en liste, uansett om det er én eller flere devices i den (men det er i plugins/eksterne programmer så jeg står vesentlig friere)

 

Men siden "Devices" er en liste, så kan det være at du må spesifisere index, altså slik:

Dim deviceJson As String = obj.Item("Devices")(0)

Dim deviceJson As String = obj.Item("Devices")(0)

... og så deserialisere JSON'en du får fra det igjen.

 

Det kan være at noe slikt fungerer:

Dim deviceJson As String = obj.Item("Devices")(0)("uptime")

... men det er et skudd i blinde.

 

 

Bruker du Visual Studio og tenScripting?

Lenke til kommentar
Del på andre sider

Tenkte jeg skulle forsøke meg på å få kontakt med MyQ. Jada, vet at det finnes en plugin til dette allerede, men fant ut at dette kunne være en artig og relativt enkel plass å begynne å se på scripting. Jeg fant først en side på nettet som kan hjelpe til med å lage de klassene man trenger, dette skal visstnok også kunne implementeres rett inn i Visual Studio, men jeg gikk på jsonutils.com. Her kan du lime inn json strengen, eller en URL, så får du ut klassene.

 

Status kan ha fire statuser : 

 

1 - åpen

2 - lukket

3 - closing

4 - opening

 

Koden min ble da som følger :

 

Class Min_lille_lekestue
    Public Class Attribute
        Public Property AttributeId As Integer
        Public Property Name As String
        Public Property Value As String
        Public Property UpdatedTime As String
        Public Property MyQDeviceTypeAttributeId As Integer
        Public Property IsDeviceProperty As Boolean
        Public Property AttributeDisplayName As String
        Public Property IsPersistent As Boolean
        Public Property IsTimeSeries As Boolean
        Public Property IsGlobal As Boolean
        Public Property UpdatedDate As DateTime
    End Class

    Public Class Device
        Public Property MyQDeviceId As Integer
        Public Property MyQDeviceTypeId As Integer
        Public Property MyQDeviceTypeName As String
        Public Property DeviceId As String
        Public Property DeviceName As String
        Public Property TypeId As Integer
        Public Property TypeName As String
        Public Property RegistrationDateTime As DateTime
        Public Property SerialNumber As String
        Public Property UserName As String
        Public Property UserConnectServerId As Integer
        Public Property UserCountryId As Integer
        Public Property Attributes As Attribute()
        Public Property ChildrenMyQDeviceIds As String
        Public Property UpdatedBy As String
        Public Property UpdatedDate As DateTime
        Public Property ParentMyQDeviceId As Integer?
    End Class

    Public Class JsonKlasse
        Public Property Devices As Device()
        Public Property ReturnCode As String
        Public Property ErrorMessage As String
        Public Property CorrelationId As String
    End Class


    Public Sub Main(ByVal Params As Object)

        Dim Attrib As New Attribute
        Dim Token As String
        Dim objToken As New JObject
        Dim TokenUrl As String
        Dim Tokenjson As String
        Dim TokenwebAddress As String
        Dim StatusUrl As String
        Dim Statusjson As String
        Dim objStatus As New JsonKlasse
        Dim Status As String
        Dim StatuswebAddress As String
        Dim appId As String
        Dim username As String
        Dim password As String

       

 

       'Some Constants
       

        appId = "Vj8pQggXLhLy0WHahglCD4N1nAkkXQtGYpq2HrHD7H1nvmbT55KqtN6RSF4ILB%2fi"
        username = "**account_name**"
        password = "**account_password**"
        TokenwebAddress = "https://myqexternal.myqdevice.com/Membership/ValidateUserWithCulture?appId="
        StatuswebAddress = "https://myqexternal.myqdevice.com/api/UserDeviceDetails?"

       

        'Get Token - gets the token from the Myq device, this will change expires after about an hour

        TokenUrl = TokenwebAddress & appId & "&securityToken=null&username=" & username & "&password=" & password & "&culture=en"
        Tokenjson = hs.URLAction(TokenUrl, "GET", "", "")
        objToken = CType(JsonConvert.DeserializeObject(Tokenjson), JObject)
        Token = objToken.Item("SecurityToken").ToString()

       

        'Get Status - getting the status json and deserealise it to a string, prints the status in immediate window of VS and the HS log
        StatusUrl = StatuswebAddress & "appId=" & appId & "&securityToken=" & Token
        Statusjson = hs.URLAction(StatusUrl, "GET", "", "")
        objStatus = JsonConvert.DeserializeObject(Of JsonKlasse)(Statusjson)
        Status = objStatus.Devices(1).Attributes(3).Value
        If Status = 2 Then

            hs.Writelog ("Garasjeporten er lukket")
            Debug.Print("Garasjen er lukket" & Status)
        End If


    End Sub

End Class

  • Like 1
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.