2010-11-16 26 views
1

Je voudrais analyser certains JSON:Comment puis-je convertir une chaîne en un flux?

void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(e.Result))) 
     { 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(STMsgObj)); 
      STMsgObj[] messages = (STMsgObj[])serializer.ReadObject(stream); 

      foreach(STMsgObj aMsg in messages){ 
       MessageBox.Show(aMsg.body, "Data Passed", MessageBoxButton.OK); 
      } 
     } 
    } 

Comment puis-je convertir en un flux e.Result?

Exception:

System.InvalidCastException was unhandled 
    Message=InvalidCastException 
    StackTrace: 
     at StockTwits.ViewModels.StreamPage.webClient_DownloadStringCompleted(Object sender, DownloadStringCompletedEventArgs e) 
     at System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e) 
     at System.Net.WebClient.DownloadStringOperationCompleted(Object arg) 
     at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark) 
     at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark) 
     at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
     at System.Delegate.DynamicInvokeOne(Object[] args) 
     at System.MulticastDelegate.DynamicInvokeImpl(Object[] args) 
     at System.Delegate.DynamicInvoke(Object[] args) 
     at System.Windows.Threading.DispatcherOperation.Invoke() 
     at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority) 
     at System.Windows.Threading.Dispatcher.OnInvoke(Object context) 
     at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args) 
     at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args) 
     at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult) 

Répondre

6

les opérations suivantes:

using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(e.Result))) 
{ 
    // Your code here, using stream. 
} 
+0

J'ai mis à jour mon code avec votre extrait de code. J'obtiens une exception InvalidCastException sur readObject. –

+0

Ceci est une question entièrement différente. Le résultat de la désérialisation n'est pas un 'STMsgObj []'. Je ne sais pas comment réparer ça. Puisque votre question originale a été répondue, postez une nouvelle question. –

0

Appel DownloadDataAsync à la place.

Vous pouvez ensuite transmettre new MemoryStream(e.Result) à partir de l'événement DownloadDataCompleted. Si vous voulez vraiment coller avec DownloadStringAsync, vous pouvez passer XmlReader.Create(new StringReader(e.Result)).

0

Étant donné que WebClient encapsule une API déjà basée sur un flux, cela signifie un nombre de conversions inutiles. Vous voudrez peut-être envisager d'échanger votre WebClient pour le vieux HttpWebRequest, qui vous donne un flux hors de la boîte.

HttpWebRequest req=(HttpWebRequest)WebRequest.Create(myUrl); 
using(var resp=req.GetResponse()) 
using(var stream=resp.GetResponseStream()) 
{ 
    ... 
} 
0

Vos données JSON ne sont pas des matrices.