Question

In a .NET 3.5 Compact Framework / Windows CE app, I need to consume some WebAPI methods that return json. RestSharp looks like it would be great for this, except that it's not quite CF-ready (see Is Uri available in some other assembly than System in .NET 3.5, or how can I resolve Uri in this RestSharp code otherwise? for details).

So, I will probably use HttpWebRequest. I can return the value from the WebAPI methods with this code:

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

...but in order to use what's returned from reader.ReadToEnd():

enter image description here

...I need to convert it back to json so that I can then query the data with LINQ to JSON using either JSON.NET (http://json.codeplex.com/) or SimpleJson (http://simplejson.codeplex.com/)

Is that realistically possible (converting StreamReader data to JSON)? If so, how?

UPDATE

I'm trying to deserialize the "json" (or string that looks like json) with this code:

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

...but get two err msgs on the "var dept =" line:

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'

So reader.ReadToEnd() returns a string, and DataContractJsonSerializer.ReadObject() expects a stream, apparently. Is there a better approach for this? Or, if I'm on the right track (although currently a section of track has been removed, so to speak), how should I get past this hurdle?

UPDATE 2

I added the System.Web.Extensions reference and then "using System.Web.Script.Serialization;" but this code:

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

...but the second line fails with:

"Type 'bla+Department' is not supported for deserialization of an array."

What type should receive the call to jss.Deserialize()? How is it defined?

Était-ce utile?

La solution

Well,

the ReadToEnd() method is used to read the stream into a string and output it. If you need a stream out to pass it to a method requiring a stream, you shouldn't use this method. From what I read on this page , it seems the BaseStream property of your reader would be more appropriate to use then.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top