[c#] WebSockets

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Hoi Tweakers,

Ivm met een projectje moet ik een API aanspreken mbv websockets.
Het lukt me inmiddels om wat calls te maken en de data te parsen, er is echter een response die ik niet geparset krijg.
Ik maak gebruik webSocket4Net en Newtonsoft.Json libraries.
De sessie wordt als volgt geïnitieert:
C#:
1
 websocket.Send("{\"Action\":\"authenticate\", \"Param\": {\"Email\": \"" + "****@*****.be" + "\", \"Password\": \"" + "123456" + "\"}}");

De response ziet er als volgt uit:
C#:
1
"{\"SessionId\": \"69e927c0-74fe-012f-2f11-3a33a321a33d\", \"ClientId\": \"2\"}"


Deze kan ik dan parsen met behulp van de sessie klasse die ik aanmaakte die er als volgt uit ziet:
C#:
1
2
3
4
5
6
7
8
9
10
{
    class Session
    {
        public string SessionId { get ; set; }
        public string ClientId { get ; set; }

        public Session()
        {
        }
    }


Op de volgende call
C#:
1
" websocket.Send("{\"Action\":\"subscriptionRequest\",\"SessionId\":\"" + si.SessionId + "\",\"Param\":\"{\\\"PositionFilters\\\":[{\\\"Subscribe\\\":true,\\\"DeviceId\\\":\\\"" + "0000000000" + "\\\"}]}\"}");" 

ontvang ik het volgende antwoord:
C#:
1
"{\"SubscriptionResponse\":[{\"Request\": \"Position\", \"DeviceId\":\"0000000000\", \"Succeeded\": true}]}"

Dit lijkt me een soort van collectie te zijn van objecten, om het object te kunnen parsen heb ik volgende klasse aangemaakt:
C#:
1
2
3
4
5
6
7
8
9
10
    class SubscriptionResponse
    {
        public string Request { get; set; }
        public string DeviceId { get; set; }
        public Boolean Succeeded { get; set; }

        public SubscriptionResponse()
        {
        }
    }


Daarmee lukt het echter nog niet om de data te parsen. Ook niet wanneer ik aangeef dat het om een array zou gaan:

C#:
1
SubscriptionResponse[] p = JsonConvert.DeserializeObject<SubscriptionResponse[]>(e.Message);


Alle suggestie szijn welkom zou ik zeggen!

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Probleem is dat wat je terug krijgt als antwoord niet een array is, maar een object met een een enkele property genaamd "SubscriptionResponse" wat een array is.

Ik ken Json.NET niet heel erg goed, maar volgens mij moet het ongeveer zo
C#:
1
2
vat root = JObject.Parse(e.Message)
var p = JsonConvert.DeserializeObject<SubscriptionResponse[]>(root["SubscriptionResponse"]);


edit: Dit zou ook moeten werken (legt mij uitleg even wat beter uit):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    class Bar
    {
        public string Request { get; set; }
        public string DeviceId { get; set; }
        public Boolean Succeeded { get; set; }
    }

    class Foo
    {

        public Bar[] SubscriptionResponse {get;set;}
    }

    var p = JsonConvert.DeserializeObject<Foo>(e.Message);

[ Voor 34% gewijzigd door TheNameless op 30-04-2012 17:56 ]

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
@TheNameless

Bedankt voor je suggestie, hélaas lijkt het niet zo te werken.
Ik krijg geen parse error ofzo maar de inhoud van "Bar[]" blijft op null staan ...

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Lunacy schreef op maandag 30 april 2012 @ 20:00:
@TheNameless

Bedankt voor je suggestie, hélaas lijkt het niet zo te werken.
Ik krijg geen parse error ofzo maar de inhoud van "Bar[]" blijft op null staan ...
Eerste oplossing werkt ook niet?

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Neen, deze syntax pakt die niet ..
C#:
1
 root["SubscriptionResponse"] 


En ik denk eigenlijk net dat dat het hele probleem is.
De 2de oplossing die je voorstelt zou waarschijnlijk wel werken moest de array niet vooraf gegaan worden door die "subscription response".
Mss enig idee wat de correcte syntax is? Kan het zelf niet meteen vinden.

[ Voor 86% gewijzigd door Lunacy op 30-04-2012 22:55 ]


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Kleine update:

Heb inmiddels zelf een alternatief uitgewerkt mbv Jobject en Jarray:

C#:
1
2
3
4
5
6
7
8
9
                JObject jsonDoc = (JObject)JObject.Parse(e.Message);
                JArray jsonArray = (JArray)jsonDoc["SubscriptionResponse"];

                foreach (JObject o in jsonArray)
                {
                    string request =  (string)o["Request"];
                    string deviceId = (string)o["DeviceId"];
                    Boolean succeeded = (Boolean)o["Succeeded"];
                }


Ben echter nog altijd wel geïnteresseerd als iemand weet hoe ik het op de eerste manier kan doen ..

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Toch vreemd, deze test methode slagen bij mij namelijk gewoon (in voorbeeld2 moest er alleen nog een .ToString() achter):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        class Bar
        {
            public string Request { get; set; }
            public string DeviceId { get; set; }
            public Boolean Succeeded { get; set; }
        }

        class Foo
        {

            public Bar[] SubscriptionResponse { get; set; }
        }


        [TestMethod]
        public void Example1()
        {
            string json = "{\"SubscriptionResponse\":[{\"Request\": \"Position\", \"DeviceId\":\"0000000000\", \"Succeeded\": true}]}";

            var p = JsonConvert.DeserializeObject<Foo>(json);
            Assert.IsNotNull(p);
            Assert.AreEqual(1, p.SubscriptionResponse.Length);
            Assert.IsTrue(p.SubscriptionResponse[0].Succeeded);
        }

        [TestMethod]
        public void Example2()
        {
            string json = "{\"SubscriptionResponse\":[{\"Request\": \"Position\", \"DeviceId\":\"0000000000\", \"Succeeded\": true}]}";
            var root = JObject.Parse(json);
            var p = JsonConvert.DeserializeObject<Bar[]>(root["SubscriptionResponse"].ToString());

            Assert.IsNotNull(p);
            Assert.AreEqual(1, p.Length);
            Assert.IsTrue(p[0].Succeeded);
        }

Ducati: making mechanics out of riders since 1946

Pagina: 1