2016-10-08 5 views
0

LitJSONから移動したJson.NETの使用に問題があります。異なるタイプのオブジェクトを分離して別々のコンストラクタを使用することができないという事実以外は、かなりうまく機能します。例えばJson.NETを使用して複数の種類のオブジェクトを1つのリストにデシリアライズする

、私はLitJSONでこれを行うことができます:

for (int i = 0; i < totalAmountOfItems; i++) 
    { 
     if (itemData[i]["type"].ToString() == "Weapons") 
     { 
      for (int j = 0; j < itemData[i]["array"].Count; j++) 
      { 
       database.Add(new Item((int)itemData[i]["array"][j]["id"], itemData[i]["array"][j]["title"].ToString(), 
            itemData[i]["array"][j]["weaponType"].ToString(), (bool)itemData[i]["array"][j]["stackable"], itemData[i]["array"][j]["slug"].ToString(), 
            (int)itemData[i]["array"][j]["damage"], (int)itemData[i]["array"][j]["durability"])); //Reads the component in quotes for object 
                                 //with address 'i'. Creates new item based 
                                 //on this data. 
                                 //Note: If using only one .Add method, all items in database must follow it's pattern. 
      } 
     } 
     else if (itemData[i]["type"].ToString() == "Food") 
     { 
      for (int j = 0; j < itemData[i]["array"].Count; j++) 
      { 
       database.Add(new Item((int)itemData[i]["array"][j]["id"], itemData[i]["array"][j]["title"].ToString(), 
            (bool)itemData[i]["array"][j]["stackable"], itemData[i]["array"][j]["slug"].ToString(), 
            (int)itemData[i]["array"][j]["hungerAmount"])); 
      } 
     } 
     else if (itemData[i]["type"].ToString() == "Medicine") 
     { 
      for (int j = 0; j < itemData[i]["array"].Count; j++) 
      { 
       database.Add(new Item((int)itemData[i]["array"][j]["id"], itemData[i]["array"][j]["title"].ToString(), 
            (bool)itemData[i]["array"][j]["stackable"], itemData[i]["array"][j]["slug"].ToString(), 
            (int)itemData[i]["array"][j]["healAmount"])); 
      } 
     } 
     else if (itemData[i]["type"].ToString() == "Equippable") 
     { 
      for (int j = 0; j < itemData[i]["array"].Count; j++) 
      { 
       database.Add(new Item((int)itemData[i]["array"][j]["id"], itemData[i]["array"][j]["title"].ToString(), 
            (bool)itemData[i]["array"][j]["stackable"], itemData[i]["array"][j]["slug"].ToString(), 
            (int)itemData[i]["array"][j]["armorAmount"], (int)itemData[i]["array"][j]["insulationAmount"])); 
      } 
     } 
     else if (itemData[i]["type"].ToString() == "Resource") 
     { 
      for (int j = 0; j < itemData[i]["array"].Count; j++) 
      { 
       database.Add(new Item((int)itemData[i]["array"][j]["id"], itemData[i]["array"][j]["title"].ToString(), 
            (bool)itemData[i]["array"][j]["stackable"], itemData[i]["array"][j]["slug"].ToString())); 
      } 
     } 
    } 

これは私が別のコンストラクタを使用して、さまざまなオブジェクトのさまざまなデータを格納するために、1つのコンテナクラス(項目)を使用することができました。 Json.NETで同じことをどうやってやりますか?

public void ConstructWeaponDatabase() 
    { 
     using (Stream s = FileOp.Open(@"Data\Misc\Weapons.json", FileAccessMode.Read)) //Opens file 
     { 
      using (StreamReader r = new StreamReader(s)) //Declares new reader 
      { 
       string json = r.ReadToEnd(); //Reads 'r' and its stream (s) to the end of the file. 
       weaponDatabase = JsonConvert.DeserializeObject<List<Misc.Weapon>>(json); //Json.NET magic to place items from file 
      }                   //into list. 
     } 
    } 

をあなたが見ることができるように、それが唯一の「武器」のいずれかの形式になります(上図の項目クラスと同じように機能Containerクラス:ここ

は、私が現在使用しているコードです。 )。 JSONファイルのWeaponに応じて異なるコンストラクタが使用されるようにするにはどうすればよいですか?

LitJSONを使用することができない理由は、ポータブルライブラリではなく、Duality(A C#のゲームエンジン)で使用されるすべてのライブラリの要件です。

答えて

0

あなたは派生JsonConverterを使用して、カスタム・ロジックを実装し、その後Deserializeにこのコンバーターのインスタンスを渡すReadJsonメソッドをオーバーライドすることができます - またthis answer

を見て、あなたはItemを使用して検討する必要がありますコンセプトの異なるオブジェクトを表すために単一のクラスを使用する代わりに、派生クラスを使用して異なるアイテム(FoodMedicineなど)を表現します。

+0

私はそれを試してみます。ありがとう! – Ovicior

関連する問題