2014-01-06 5 views
2

Я, к сожалению, вынужден иметь дело с плотом данных JSON и поэтому неизбежно дефолт к json.net, в котором я обнаружил, что «документация» работает исключительно в причудливо упрощенных примерах.Десертизация реального мира Данные JSON

Мои данные содержат в качестве примера «экземпляр».

"team" : [{ 
     "id" : "8", 
     "vendor-id" : "8", 
     "statsinc-id" : "8", 
     "team-name" : "", 
     "team-nickname" : "Pistons", 
     "rank" : "" 
    }, { 
     "id" : "51", 
     "vendor-id" : "29", 
     "statsinc-id" : "29", 
     "team-name" : "", 
     "team-nickname" : "Grizzlies", 
     "rank" : "" 
    } 
] 

Теперь имейте в виду обе стороны этой строки/независимо от термина json, представляет собой большое количество других данных.

Есть три проблемы.

  1. Я следил за документацией и не мог заставить ее выплевывать какую-либо ценность (я пытался получить поле id).

  2. «Атрибуты» имеют в них дефисы, C# не допускает дефисов в именах переменных/свойств так, как вы справляетесь с этим?

  3. В приведенном выше экземпляре есть два атрибута «каждый», поэтому, по-видимому, последний перезаписывает первое в объекте, должен ли мне список объектов, а затем каким-то образом определить способ вставки каждого значения последовательно?

Я считаю, что все это напрасно сложным, и я поэтому остро нуждается в помощи - это очень много, чтобы спросить, но если кто-то может показать мне, как получить как «команде прозвище» значения, что я бы благодарен.

Заранее благодарен.

+0

Возможно, причина вы находите «все это без необходимости сложного», потому что ваш вопрос показывает довольно непонимание JSON, квадратная скобка после «команды»: обозначает начало массива, поэтому дубликаты не дублируются, они разные записи. Я предлагаю вам изучить что-то немного лучше, прежде чем критиковать его, могу ли я предложить сайт w3c: http://www.w3schools.com/json/ ?? –

+0

Создайте базовые объекты для каждого типа, затем используйте композицию для большего объекта, который вы можете использовать для десериализации. Также вы можете попробовать использовать словарь >> Первый словарь отображает базовый объект, список содержит несколько словарей, которые сопоставляются с внутренними объектами – Carlos487

ответ

8

Для выдачи имени вы должны использовать JsonPropertyAttribute, чтобы указать, какие имена свойств (когда они не могут быть выведены, или вы хотите, чтобы они были разными).

Существует несколько элементов, но они находятся в массиве, так что вы можете получить доступ к обоим. Они не перезаписывают друг друга.

Вы можете использовать JSONLint для проверки JSON и json2csharp, чтобы попытаться сгенерировать классы C# на основе JSON.

Ваш JSON, как есть, недействителен для полного JSON. Я завернул его в {} сделать это объект, а затем был в состоянии создать эти классы:

public class RootObject 
{ 
    public List<Team> team { get; set; } 
} 

public class Team 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("vendor-id")] 
    public string VendorId { get; set; } 
    [JsonProperty("statsinc-id")] 
    public string StatsIncId { get; set; } 
    [JsonProperty("team-name")] 
    public string TeamName { get; set; } 
    [JsonProperty("team-nickname")] 
    public string TeamNickname { get; set; } 
    [JsonProperty("rank")] 
    public string Rank { get; set; } 
} 

// this works! 
var obj = JsonConvert.DeserializeObject<RootObject>(data); 
var nicknames = obj.team.Select(x => x.TeamNickname); // "Pistons", "Grizzlies" 

Я JsonProperty указать все имена свойств в Team (не только дефис те), так что я может использовать стандартную капитализацию свойств C# /. Net, все еще сериализуя и десериализируя правильно.

+0

Tricksy, делает работу блестяще и, надеюсь, поможет мне сортировать из всего остального, огромное спасибо. – user1006221

3

Что касается 2. Когда вы создаете класс, который вы собираетесь быть десериализации вам будет отмечать свои свойства, как например:

[JsonProperty(PropertyName = "team-name")] 
public string teamName { get; set; } 

[JsonProperty(PropertyName = "team-nickname")] 
public string teamNickname { get; set; } 

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

5

Создать класс для объекта команды:

public class Team { 
    [JsonProperty(PropertyName = "id")] 
    public int ID {get;set;} 
    [JsonProperty(PropertyName = "vendor-id")] 
    public int VendorID {get;set;} 
    [JsonProperty(PropertyName = "statsinc-id")] 
    public int StatsIncID {get;set;} 
    [JsonProperty(PropertyName = "team-name")] 
    public string TeamName {get;set;} 
    [JsonProperty(PropertyName = "team-nickname")] 
    public string TeamNickname {get;set;} 
    [JsonProperty(PropertyName = "rank")] 
    public Rank {get;set;} 
} 

Затем вы можете десериализации вашего JSON, выполнив:

var listOfTeams = JsonConvert.DeserializeObject<List<Team>(inputString); 
Смежные вопросы