2013-10-19 6 views
0

JSON 데이터를 C#의 고유 한 클래스에 매핑하고 필요로하는 곳에서 다양한 데이터를 표시하려고합니다. 그러나 데이터가 필요할 때 데이터를 얻을 수없는 작은 문제가 있습니다. 내가 할 수 있어야한다고 생각해. 분명히 뭔가 잘못이고 나는 누군가가 올바른 방향으로 날 지점 수있는 기대했다 : JSON의Json의 데이터 세트에 액세스하기

예 조각 : 나는 다음과 같이 내 자신의 클래스에이 직렬화하려면 다음을 사용하고

"items" 
{  
    "0" 
    { 
     "name"  "Riki's Dagger" 
     "prefab"  "default_item" 
     "item_name"  "#DOTA_Item_Rikis_Dagger" 
     "item_type_name"  "#DOTA_WearableType_Daggers" 
     "model_player"  "models/heroes/rikimaru/rikimaru_weapon.mdl" 
     "used_by_heroes" 
     { 
      "npc_dota_hero_riki"  "1" 
     } 
    } 
    "1" 
    { 
     "name"  "Anti-Mage's Glaive" 
     "prefab"  "default_item" 
     "item_description"  "#DOTA_Item_Desc_AntiMages_Glaives" 
     "item_name"  "#DOTA_Item_AntiMages_Glaive" 
     "item_type_name"  "#DOTA_WearableType_Glaive" 
     "model_player"  "models/heroes/antimage/antimage_weapon.mdl" 
     "used_by_heroes" 
     { 
      "npc_dota_hero_antimage"  "1" 
     } 
} 

:

DotaItemsGameResult itemGameResult 
    = JsonConvert.DeserializeObject<DotaItemsGameResult>(rawItemDetailsJson); 

다른 곳에서도 사용 했으므로 정상적으로 작동합니다.

말썽

여기에 온다 :

string dataToDisplay = ""; 

foreach (DotaItemsGameItem item in itemGameResult.Items_Game.Items.Item_Index) 
{ 
    dataToDisplay += "<h3> Item: " + item.Name + "</h3>";     
    dataToDisplay += "<p> Quality: " + item.Item_Quality + "</p>"; 
    dataToDisplay += "<p> Attributes: " + item.Used_By_Heroes + "</p>"; 
} 

return dataToDisplay; 

내 코드는 내가 .Items_Index에 더 가고 싶은 경우에 대한 itemGameResult.Items_Game.Items하지만 알고 보인다.

나는 다음과 같은 클래스가 있습니다

public class DotaItemsGameResult 
{ 
    public DotaItemsGameResultProperties Items_Game { get; set; } 
} 

public class DotaItemsGameResultProperties 
{ 
    public List<DotaItemsGameRarities> Rarities { get; set; } 
    public List<DotaItemsGameItems> Items { get; set; } 
} 

public class DotaItemsGameItems 
{ 
    public List<DotaItemsGameItem> Item_Index { get; set; } 
} 

public class DotaItemsGameItem 
{ 
    public string Name { get; set; } 
    public string Hidden { get; set; } 
    public string Item_Class { get; set; } 
    public string Item_Name { get; set; } 
    public string Item_Slot { get; set; } 
    public string Item_Quality { get; set; } 
    public string Min_Ilevel { get; set; } 
    public string Max_Ilevel { get; set; } 
    public string Item_Description { get; set; } 
    public string Item_Type_Name { get; set; } 
    public List<DotaItemsGameUsedByHero> Used_By_Heroes { get; set; }   
} 

는 기본적으로, 내 목표는 내 루프에서 Used_By_Heroes 데이터를 얻을 수있을 것입니다하지만 난 할 수 없습니다.

내 각각 itemGameResult.Items_Game.Items은 괜찮지 만 itemGameResult.Items_Game.Items.Item_Index은 아닙니다. 이유는 알 수 없습니다.

도트 표기법을 사용할 때 Item_Index에 액세스 할 수 없으므로 여기에 Item_Index이 있어야합니다. 1 'System.Collections.Generic.List은'ITEM_INDEX '없이 확장 방법에 대한 정의를 포함하지 않는

오류'ITEM_INDEX '는 수락 : 어쨌든에 넣어 컴파일하려고하면,이 참조 'System.Collections.Generic.List'유형의 첫 번째 인수를 찾을 수 있습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?).

도움이 될 것입니다.

답변

1

문제는 클래스 DotaItemsGameResultPropertiesItems 속성 모음 (List<DotaItemsGameItems>) 인 그래서 속성 Item_Index이없는 것입니다. 당신이 달성 싶어하지만,이 문제를 해결하는 하나의 가능성이 컬렉션을 반복하는 것입니다 무엇인지 확실하지 :

string dataToDisplay = ""; 

foreach (DotaItemsGameItems items in itemGameResult.Items_Game.Items) 
{ 
    foreach (DotaItemsGameItem item in items.Item_Index) 
    { 
     dataToDisplay += "<h3> Item: " + item.Name + "</h3>";     
     dataToDisplay += "<p> Quality: " + item.Item_Quality + "</p>"; 
     dataToDisplay += "<p> Attributes: " + item.Used_By_Heroes + "</p>"; 
    } 
} 

return dataToDisplay; 

이 데이터의 구조가 좀 더 간결한 방법으로이 작업을 수행 할 수 있습니다 설명하는 것입니다 :

string dataToDisplay = ""; 

var allItems = itemGameResult.Items_Game.Items.SelectMany(i => i.Item_Index); 
foreach (DotaItemsGameItem item in allItems) 
{ 
    dataToDisplay += "<h3> Item: " + item.Name + "</h3>";     
    dataToDisplay += "<p> Quality: " + item.Item_Quality + "</p>"; 
    dataToDisplay += "<p> Attributes: " + item.Used_By_Heroes + "</p>"; 
} 

return dataToDisplay; 
+0

아 .. 그럴 것입니다. 바보 같아서 ... 도와 줘서 고마워! – Goose

관련 문제