Что такое 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);
Это задница ели вашего 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);
EDIT: Я полностью согласен с Ароном в том, что вы не должны излишне использовать поля-члены и убедитесь утилизировать потоки должным образом.
Улучшение моего первоначального ответа со своими предложениями, следующий код, который я предложил ранее:
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;
}
Это будет по-прежнему работать с явными атрибутами JSON сериализации, которые я добавил в свой класс ServerInfo. Обратите внимание, что они не являются строго необходимыми, если имена свойств совпадают. Я делаю это в основном только для того, чтобы показать вам, как получить больший контроль над поведением сериализации без необходимости внедрять пользовательский JsonSerializer.
Какая ошибка вы получаете? – ZivS
Для исполнения вы действительно не должны преобразовывать 'Stream' в строку. Попробуйте это вместо этого. http://www.newtonsoft.com/json/help/html/DeserializeWithJsonSerializerFromFile.htm – Aron