什么是你的响应体中的json?
您可能希望从一点测试开始,以确保响应正文可以正确地反序列化到您的ServerInfo类中。这是个人喜好的问题,但我喜欢更明确地做事情,因为它有助于最大限度地减少意外行为。
例如,你可以装饰你这样的ServerInfo类:
// I chose MemberSerialization.OptIn so that all members need to be
// included explicitly, rather than implicitly (which is the default)
[JsonObject(MemberSerialization.OptIn)]
public class ServerInfo
{
[JsonProperty]
public string message { get; set; }
[JsonProperty]
public string message_timestamp { get; set; }
}
然后,您读了充分HttpWebResponse身体成字符串像这样:
reader = new StreamReader(webResponse.GetResponseStream());
string responseBody = reader.ReadToEnd();
reader.Close();
最后,你反序列化响应正文到你的ServerInfo类如下:
ServerInfo serverInfo = JsonConvert.DeserializeObject<ServerInfo>(responseBody);
这是屁股uming您的JSON会在下面的格式(或类似结构):
{
"message": "Test Message",
"message_timestamp": "2015-04-04T20:00:00"
}
当然,你应该首先检查你的实际输入正确的反序列化。我想以上格式的单元测试这个简单的代码片段:
var sb = new StringBuilder();
sb.Append("{");
sb.AppendLine();
sb.AppendFormat("\"{0}\": \"{1}\"", "message", "Test Message");
sb.Append(",");
sb.AppendLine();
sb.AppendFormat("\"{0}\": \"{1}\"", "message_timestamp", "2015-04-04T20:00:00");
sb.AppendLine();
sb.Append("}");
string json = sb.ToString();
ServerInfo serverInfo = JsonConvert.DeserializeObject<ServerInfo>(json);
编辑:我完全,你不应该使用不必要成员字段,并始终确保妥善处置流用阿隆同意。
提高我原来的答复与他的建议,下面的代码我刚才所说:
webRequest = (HttpWebRequest)WebRequest.Create("http://" + Ip.ToString() + ":" + Port.ToString() + "........");
webRequest.Method = "GET";
webRequest.KeepAlive = true;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.CookieContainer = cookieJar;
webResponse = (HttpWebResponse)webRequest.GetResponse();
reader = new StreamReader(webResponse.GetResponseStream());
string responseBody = reader.ReadToEnd();
reader.Close();
ServerInfo serverInfo = JsonConvert.DeserializeObject<ServerInfo>
my_label_ServerInfo.Text = serverInfo.message;
会变成这样,这将更好的表现,是不易出错(我删除了简短的评论,看到阿隆的解释回答):
var webRequest = (HttpWebRequest)WebRequest.Create("http://" + Ip.ToString() + ":" + Port.ToString() + "........");
webRequest.Method = "GET";
webRequest.KeepAlive = true;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.CookieContainer = cookieJar;
var webResponse = (HttpWebResponse)webRequest.GetResponse();
using (var stream = webResponse.GetResponseStream())
using (var reader = new StreamReader(stream))
{
JsonSerializer serializer = new JsonSerializer();
ServerInfo serverInfo = (ServerInfo)serializer.Deserialize(reader, typeof(ServerInfo));
my_label_ServerInfo.Text = serverInfo.message;
}
这将仍然与我添加到您的ServerInfo类显式的JSON序列化属性一起工作。请注意,如果属性名称匹配,则它们不是绝对必需的。我这样做主要是为了向您展示如何在不需要实现定制的JsonSerializer的情况下获得对序列化行为的更多控制权。
你得到的错误是什么? – ZivS 2015-04-04 17:10:00
对于性能,你真的不应该把'Stream'转换成'string'。试试这个。 http://www.newtonsoft.com/json/help/html/DeserializeWithJsonSerializerFromFile.htm – Aron 2015-04-04 18:37:17