0

在 .NET 3.5 Compact Framework / Windows CE 应用程序中,我需要使用一些返回 json 的 WebAPI 方法。RestSharp 看起来很适合这个,除了它还没有完全准备好 CF(请参阅.NET 3.5 中的 System 之外的其他程序集中是否可用 Uri,或者如何在此 RestSharp 代码中解析 Uri?了解详细信息)。

所以,我可能会使用 HttpWebRequest。我可以使用以下代码从 WebAPI 方法返回值:

string uri = "http://localhost:48614/api/departments";
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    StreamReader reader = new StreamReader(webResponse.GetResponseStream());
    MessageBox.Show("Content is " + reader.ReadToEnd());
}
else
{
    MessageBox.Show(string.Format("Status code == {0}", webResponse.StatusCode));
}

...但是为了使用从 reader.ReadToEnd() 返回的内容:

在此处输入图像描述

...我需要将其转换回 json,以便我可以使用 JSON.NET ( http://json.codeplex.com/ ) 或 SimpleJson ( http://simplejson.codeplex ) 使用 LINQ to JSON 查询数据.com/ )

这真的可能吗(将 StreamReader 数据转换为 JSON)?如果是这样,怎么做?

更新

我正在尝试使用以下代码反序列化“json”(或看起来像 json 的字符串):

string uri = "http://localhost:48614/api/departments";
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.Method = "GET";
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    StreamReader reader = new StreamReader(webResponse.GetResponseStream());
    DataContractJsonSerializer jasonCereal = new DataContractJsonSerializer(typeof(Department));
    var dept = (Department)jasonCereal.ReadObject(reader.ReadToEnd());
    MessageBox.Show(string.Format("accountId is {0}, deptName is {1}", dept.AccountId, dept.DeptName));
}

...但是在“var dept =”行上得到两个错误消息:

0) The best overloaded method match for 'System.Runtime.Serialization.XmlObjectSerializer.ReadObject(System.IO.Stream)' has some invalid arguments

1) Argument '1': cannot convert from 'string' to 'System.IO.Stream'

所以 reader.ReadToEnd() 返回一个字符串,而 DataContractJsonSerializer.ReadObject() 显然需要一个流。有更好的方法吗?或者,如果我走在正确的轨道上(尽管目前有一部分轨道已被删除,可以这么说),我应该如何克服这个障碍?

更新 2

我添加了 System.Web.Extensions 参考,然后“使用 System.Web.Script.Serialization;” 但是这段代码:

JavaScriptSerializer jss = new JavaScriptSerializer();
var dept = jss.Deserialize<Department>(s);
MessageBox.Show(string.Format("accountId is {0}, deptName is {1}",  
    dept.AccountId, dept.DeptName));

...但是第二行失败了:

"数组的反序列化不支持类型 'bla+Department'。 "

什么类型应该接收对 jss.Deserialize() 的调用?它是如何定义的?

4

1 回答 1

1

出色地,

ReadToEnd()方法用于将流读入字符串并输出。如果您需要一个流来将其传递给需要流的方法,则不应使用此方法。从我在此页面上阅读的内容来看,您的读者的属性似乎BaseStream更适合使用。

于 2013-10-16T08:51:21.673 回答