2016-07-06 14 views
1

Ich habe Methode wie folgt:UWP und Json Parsen

public static async void DoSomething() 
{ 
    try 
    { 
     var client = new HttpClient(); 
     var url = "http://10.0.0.68/SET Initialization"; 
     var url2 = "http://10.0.0.68/GET Status"; 
     var response = await client.GetAsync(url); 
     Debug.WriteLine(response); 
     response = await client.GetAsync(url2); 
     Debug.WriteLine(response); 
     var result =await response.Content.ReadAsStringAsync(); 
     var jsonString = result.Substring(4); 
     var serializer = new DataContractJsonSerializer(typeof(MediaStatus)); 
     var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 
     var data = (MediaStatus)serializer.ReadObject(ms); 
     Debug.Write(data.ProgNo); 
    } 
    catch (Exception exception) 
    { 
     Debug.WriteLine(exception.Message, exception.Source); 
    } 
} 

MediaStatus.cs

[DataContract] 
public class MediaStatus 
{ 
    [DataMember(Name = "progNo")] 
    public int ProgNo { get; set; } 
    [DataMember(Name = "index")] 
    public int Index { get; set; } 
    [DataMember(Name = "type")] 
    public string Type { get; set; } 
    [DataMember(Name = "group")] 
    public int Group { get; set; } 
    [DataMember(Name = "msg")] 
    public string Msg { get; set; } 
    [DataMember(Name = "secondGroup")] 
    public int SecondGroup { get; set; } 
    [DataMember(Name = "playFlag")] 
    public int PlayFlag { get; set; } 
} 

ich es einfach nenne:

common.DoSomething(); 

Mein Problem ist, dass manchmal , der Code läuft gut und gibt mir ein Ergebnis, aber manchmal habe ich einen Fehler:

Exception thrown: 'System.Runtime.Serialization.SerializationException' in System.Private.DataContractSerialization.dll System.Private.DataContractSerialization:Expecting element 'root' from namespace ''.. Encountered 'None' with name '', namespace ''.

Ich habe zwei Mal anrufen await client.GetAsync mit verschiedenen Urls

  1. zu sagen, Server, Ich mag würde mit ihm
  2. sprechen Info zu erhalten Status
+1

Sie sind in einem Asynchron-Methode, warum verwenden Sie .RESULT statt von erwarten? Wie auch immer, poste den JSON, auf den er geworfen wird. Du wirst vielleicht keinen JSON zurückbekommen, der ihn werfen lässt. – Dispersia

+0

Hallo, danke für die Antwort, ich habe es geändert in: var result = erwarten response.Content.ReadAsStringAsync(); aber hat nicht geholfen – petrtim

+0

Es ist wahrscheinlich missgebildet JSON. Kannst du den JSON selbst veröffentlichen? –

Antwort

0

Dies ist Klassisches Problem, bei dem Sie ein Feuer-und-vergessen-Verfahren aufrufen, da Ihre DoSomething-Methode als async void definiert ist. Der einzige Einstiegspunkt für Methoden, die als void markiert werden sollten, sind Ereignishandler und dergleichen. Diese Methode sollte stattdessen sein Task wie diese Rückkehr:

public static async Task DoSomethingAsync() 
{ 
    try 
    { 
     using (var client = new HttpClient()) 
     { 
      var url = "http://10.0.0.68/SET Initialization"; 
      var url2 = "http://10.0.0.68/GET Status"; 
      var response = await client.GetAsync(url); 
      Debug.WriteLine(response); 
      response = await client.GetAsync(url2); 
      Debug.WriteLine(response); 
      var result = await response.Content.ReadAsStringAsync(); 
      var jsonString = result.Substring(4); 
      var serializer = new DataContractJsonSerializer(typeof(MediaStatus)); 
      var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 
      var data = (MediaStatus)serializer.ReadObject(ms); 
      Debug.Write(data.ProgNo); 
     } 
    } 
    catch (Exception exception) 
    { 
     Debug.WriteLine(exception.Message, exception.Source); 
    } 
} 

Zusätzlich sollte das Verfahren den „Async“ Suffix müssen deutlich zeigen, dass die Methode asynchron sein soll. Ebenso habe ich die Verwendung der HttpClient so geändert, dass sie in eine using Anweisung eingebettet wird, da sie die IDisposable Schnittstelle implementiert.

Wenn Sie diese Methode aus dem ein Event-Handler aufrufen müssen, unten ist ein Beispiel für so aus dem .Loaded Ereignis zu tun:

private async void OnLoaded(object sender, RoutedEventArgs e) => 
    await common.DoSomethingAsync();