0

JSONデータをC#で自分のクラスにマッピングし、必要な場所にさまざまなデータを表示しようとしていますが、できるはずだと信じているときにデータを取得できないように見えるという小さな問題があります。明らかに何かがおかしいので、誰かが私を正しい方向に向けてくれることを望んでいました:

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;

私のコードはitemGameResult.Items_Game.Items.Items_Index.

次のクラスがあります。

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ループ内のデータを取得できるようにすることですが、できません。

私の for each ではitemGameResult.Items_Game.Items問題ありませんがitemGameResult.Items_Game.Items.Item_Index、そうではなく、理由がわかりません。

Item_Indexドット表記を使用すると、にアクセスできませんItem_Index。そこにあると思われる場所がありません。とにかくそれを入れてコンパイルしようとすると、次のように表示されます。

エラー 1 'System.Collections.Generic.List' には 'Item_Index' の定義が含まれておらず、タイプ 'System.Collections.Generic.List' の最初の引数を受け入れる拡張メソッド 'Item_Index' が見つかりませんでした (ディレクティブまたはアセンブリ参照を使用していますか?)。

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

1

問題はItems、クラスのプロパティがDotaItemsGameResultPropertiesコレクション ( List<DotaItemsGameItems>) であるため、プロパティがないことItem_Indexです。何を達成したいのかわかりませんが、これを修正する1つの可能性は、このコレクションでも繰り返すことです:

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;
于 2013-10-19T10:17:43.287 に答える