Как я могу преобразовать строку в поток? - PullRequest
1 голос
/ 16 ноября 2010

Я хотел бы проанализировать JSON:

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); 
            }
        }
    }

Как преобразовать e.Result в поток?

Исключение:

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)

Ответы [ 4 ]

6 голосов
/ 16 ноября 2010

Попробуйте следующее:

using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(e.Result)))
{
    // Your code here, using stream.
}
0 голосов
/ 16 ноября 2010

Ваши данные JSON не являются массивом.

0 голосов
/ 16 ноября 2010

Учитывая, что WebClient оборачивает API, который уже основан на потоке, означает, что существует ряд ненужных преобразований.Возможно, вы захотите поменять ваш WebClient на старый HttpWebRequest, что даст вам поток из коробки.

HttpWebRequest req=(HttpWebRequest)WebRequest.Create(myUrl);
using(var resp=req.GetResponse())
using(var stream=resp.GetResponseStream())
{
    ...
}
0 голосов
/ 16 ноября 2010

Звоните DownloadDataAsync вместо.

Затем вы можете передать new MemoryStream(e.Result) из события DownloadDataCompleted.

Если вы действительно хотите придерживаться DownloadStringAsync, вы можете передать XmlReader.Create(new StringReader(e.Result)).

...