2015-06-24 2 views
4

Я создать класс для десериализации this JSONDeserealization не работает должным образом

public class Self 
{ 
    public string href { get; set; } 
} 

public class Team 
{ 
    public string href { get; set; } 
} 

public class Links 
{ 
    public Self _self { get; set; } 
    public Team team { get; set; } 
} 

public class Player 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string position { get; set; } 
    public int jerseyNumber { get; set; } 
    public string dateOfBirth { get; set; } 
    public string nationality { get; set; } 
    public string contractUntil { get; set; } 
    public string marketValue { get; set; } 
} 

public class RootObject 
{ 
    public Links _links { get; set; } 
    public int count { get; set; } 
    public List<Player> players { get; set; } 
} 

public struct Player_Struct 
{ 
    public string id; 
    public string name; 
    public string position; 
    public int jerseyNumber; 
    public string dateOfBirth; 
    public string nationality; 
    public string contractUntil; 
    public string marketValue; 
} 

Так что я сделал функцию, чтобы создать HttpRequest и относительный объект:

string requestUrl = teams.link_teams; 
string responseText = parser.Request(requestUrl); 
var obj = JsonConvert.DeserializeObject<Players.RootObject>(responseText); 

Теперь проблема это, что компилятор вернуть это исключение:

Необработанное исключение «Newtonsoft.Json.JsonSerializationException» в Newtonsoft.Js on.dll

Ulerri informazioni: Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип «SF_DebugProject.API.Players + Links», потому что для десериализации корректно требуется тип JSON (например, {«name»: «value»}).

Для исправления этой ошибки либо смените JSON на объект JSON (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList) как List, который можно десериализовать из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON.

Путь «_links», строка 1, позиция 11.

Так с починки намеком я попытался исправить ошибку изменить объект в:

List<Players.RootObject> obj = JsonConvert.DeserializeObject<List<Players.RootObject>>(responseText); 

, но таким образом, Я не вижу никакого атрибута rootobject, когда я делаю foreach. Что я делаю неправильно?

+0

Где JSON? В сообщении говорится, что форма ввода не соответствует целевым типам. Дезициализация не может изменить форму данных. Если ваш вход содержит массив игроков без каких-либо других данных, вы не можете заставить его стать «RootObject» –

+0

. Json находится здесь: http://api.football-data.org/alpha/teams/19/players В любом случае, с этим объектом я могу увидеть параметр RootObject: var obj = JsonConvert.DeserializeObject (responseText); , но по какой-то странной причине возвращается исключение. –

ответ

1

Насколько я понимаю, вы хотите десериализовать строку JSON в RootObject, который содержит список игроков.

классы должны выглядеть следующим образом:

public class Rootobject 
{ 
    public _Links _links { get; set; } 
    public int count { get; set; } 
    public Player[] players { get; set; } 
} 

public class _Links 
{ 
    public _Self _self { get; set; } 
    public Team team { get; set; } 
} 

public class _Self 
{ 
    public string href { get; set; } 
} 

public class Team 
{ 
    public string href { get; set; } 
} 

public class Player 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string position { get; set; } 
    public int jerseyNumber { get; set; } 
    public string dateOfBirth { get; set; } 
    public string nationality { get; set; } 
    public string contractUntil { get; set; } 
    public string marketValue { get; set; } 
} 

Так что вы должны сделать что-то вроде следующего:

var obj = JsonConvert.DeserializeObject<RootObject>(response); 
foreach(var player in obj.players) 
{ 
    // some stuff 
} 
+0

он точно делает это – dotctor

+0

На самом деле я уже это делаю. Моя проблема в том, что я не вижу параметров каждого игрока. Параметры - это те, что содержатся в классе Player. Обращаясь к первому объекту, я вижу параметры (переменную), суть в том, что во время выполнения функции я получаю исключение. –

+0

Хорошо, я отредактировал свой ответ, чтобы показать классы C#, которые будут использоваться. – PMerlet

Смежные вопросы