json.net DeserializeObject

У меня есть следующий код:

string code = client.DownloadString("http://oddsportal.com/feed/prematch/1-1-hSpbs4Cd-1-2.dat");
DataSet data = JsonConvert.DeserializeObject<DataSet>(code.Substring(3, code.Length - 6));
textBox1.Text += "1";

Но он останавливается на второй строке, как если бы был return - он не записывает 1 в текстовое поле. Что я делаю неправильно?

Здесь он переписан со структурой: http://pastebin.com/xZAhjU8w Спасибо.

РЕДАКТИРОВАТЬ: A использовал try-catch, и его исключение:

Newtonsoft.Json.JsonSerializationException: после завершения десериализации объекта в строке JSON обнаружен дополнительный текст. в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (средство чтения JsonReader, тип objectType, логическое значение checkAdditionalContent) в c: \ Temp \ Json \ Working \ Newtonsoft.Json \ Src \ Newtonsoft.Json \ Serialization \ JsonSerializerInternalReader.cs 17: строка New: .Json.JsonSerializer.DeserializeInternal (читатель JsonReader, тип objectType) в c: \ Temp \ Json \ Working \ Newtonsoft.Json \ Src \ Newtonsoft.Json \ JsonSerializer.cs: строка 711 в Newtonsoft.Json.JsonSerializer.Deserialize (читатель JsonReader , Введите objectType) в c: \ Temp \ Json \ Working \ Newtonsoft.Json \ Src \ Newtonsoft.Json \ JsonSerializer.cs: строка 663 в Newtonsoft.Json.JsonConvert.DeserializeObject (строковое значение, тип типа, настройки JsonSerializerSettings) в c : \ Temp \ Json \ Working \ Newtonsoft.Json \ Src \ Newtonsoft.Json \ JsonConvert.cs: строка 797 в Newtonsoft.Json.JsonConvert.DeserializeObject [T] (строковое значение, настройки JsonSerializerSettings) в c: \ Temp \ Json \ Рабочий \ Newtonsoft.Json \ Src \ Newtonsoft.Json \ JsonConvert.cs: строка 757 в Newtonsoft.Json.JsonConvert.DeserializeObject [T] (строковое значение) в c: \ Temp \ Json \ Working \ Newtonsoft.Json \ Src \ Newtonsoft.Json \ JsonConvert.cs: строка 694 в oddsreader.Form1.Form1_Load (отправитель объекта , EventArgs e) в c: \ Users \ zuz \ Documents \ Visual Studio 2012 \ Projects \ oddsreader \ oddsreader \ Form1.cs: строка 692

Когда я попробовал несколько онлайн-валидаторов json, они вернули, что строка действительна. Что может быть в этом плохого?

EDIT2: Возможно, я был совершенно неправ. Поэтому я задам вопрос попроще. Как я мог сделать foreach массива «odds», а затем foreach его подмассивов? Путь к коэффициентам следующий: ["d"] ["oddsdata"] ["back"] ["E-1-2-0-0-0"] ["odds"]. Я не нашел пример кода с режимом больше двухуровневых массивов.


person LukAss741    schedule 03.08.2013    source источник


Ответы (2)


Ваша проблема не в строке, а в приведении к «DataSet». У меня это отлично работает:

static void Main(string[] args)
{
    WebClient client = new WebClient();
    string code = client.DownloadString("http://oddsportal.com/feed/prematch/1-1-hSpbs4Cd-1-2.dat");
    client.Dispose();

    code = code.Replace("-|-", string.Empty);

    JObject json = JsonConvert.DeserializeObject<JObject>(code);

    int one = (int)json["d"]["bt"];

    Debug.Assert(one == 1);
}
person Fred Deschenes    schedule 03.08.2013
comment
Это хорошо. Спасибо. Но теперь мне понадобится что-то вроде foreach(subarray in json["d"]["oddsdata"]["back"]["E-1-2-0-0-0"]), как я могу это сделать? - person LukAss741; 03.08.2013
comment
@ LukAss741 Вы можете сделать это, чтобы перебрать все ключи / значения в дочернем JObject foreach (JProperty prop in ((JObject)json["d"]["oddsdata"]["back"]["E-1-2-0-0-0"]).Properties()) { Console.WriteLine(string.Format("obj[{0}] = {1}", prop.Name, prop.Value)); }, но, как вы можете видеть, с таким плохо отформатированным JSON это будет PITA - person Fred Deschenes; 03.08.2013

Похоже, что JsonConvert не удалось выполнить DeserializeObject для вашего параметра, который вы передали.

То есть (3, code.Length - 6), вероятно, не дает вам допустимой строки json, поэтому JsonConvert не может ее преобразовать.

Вероятно, было сгенерировано исключение, но вы его не поймали, поэтому оно показало поведение, подобное «возврату».

person ali    schedule 03.08.2013
comment
Что вы имеете в виду под параметром? Источник написан как - | - {json} - | -, я не знаю почему. Итак, эта подстрока была использована для его обрезки. Или это могло как-то повредить строку json? - person LukAss741; 03.08.2013
comment
О, так есть строка -|-{json}-|-, добавленная к началу строки json, которая находится в ссылке? - person ali; 03.08.2013
comment
Я разместил на pastebin его структурированный код, чтобы он был удобочитаемым человеком. Оригинал имеет - | - в начале и в конце. - person LukAss741; 03.08.2013
comment
соответствует ли ваш объект DataSet строковому формату json? - person ali; 03.08.2013
comment
Я не понимаю, что вы имеете в виду. У меня нет большого опыта работы с json, и я впервые пытаюсь работать с ним на C #. Если бы в примере у меня был этот код: { "s": 1, "d": { "bt": 1, "sc": 2 } } Тогда я хотел бы получить к нему доступ, например: variable [d] [bt]; что было бы равно 1. Правильно ли вообще такой подход? - person LukAss741; 03.08.2013