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?

Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top