Reputation: 20348
I am trying to make a desktop client for Request and Response application.
I am able to do GET requests easily. But I was wondering whether someone could help me work out how I could do a JSON request and response. and parse it to a string, from there I can workout how to slit it all up
Upvotes: 16
Views: 52922
Reputation: 65456
Small update:
As an alternative to System.Web or JSON.net, there's also JSONFX and ServiceStack.Text
For a desktop application one solution for making a JSON request is below. There may be an API somewhere to already do this but I haven't found any.
'Test' is just here to demonstrate passing parameters. JavaScriptSerializer
is found in System.Web.Extensions.dll.
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create("http://localhost:2616/Default.aspx/JsonTester");
request.ContentType = "application/json; charset=utf-8";
request.Accept = "application/json, text/javascript, */*";
request.Method = "POST";
using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write("{id : 'test'}");
}
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
string json = "";
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
json += reader.ReadLine();
}
}
// 3.5+ adds 'D' to the result, e.g.
// {"d":"{\"Name\":\"bob\",\"Age\":20,\"Foods\":[\"cheeseburger\",\"caviar\"]}"}
// So it thinks it's a dictionary with one key/value
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> x = (Dictionary<string, object>)serializer.DeserializeObject(json);
MyData data = serializer.Deserialize<MyData>(x["d"].ToString());
[WebMethod]
public static string JsonTester(string id)
{
JavaScriptSerializer ser = new JavaScriptSerializer();
var jsonData = new MyData()
{
Name = "bob",
Age = 20,
Foods = new List<string>()
};
jsonData.Foods.Add("cheeseburger");
jsonData.Foods.Add("caviar");
var result = ser.Serialize(jsonData);
return result;
}
MyData
appears in both the web app and the console app, but you'll want to put it in its own assembly as your domain object and reference it in the two places.
public class MyData
{
public string Name { get; set; }
public int Age { get; set; }
public IList<String> Foods { get; set; }
}
Upvotes: 20
Reputation:
Look into the System.Web.Script.Serialization.JavaScriptSerializer class in the System.Web.Extensions.dll assembly.
It contains the Serialize and Deserialize< T > methods which are fairly straight-forward to use.
Upvotes: 3