2016-10-08 5 views
0

Ich habe Probleme mit Json.NET, zu dem ich von LitJSON wechselte. Es funktioniert ganz gut, abgesehen von der Tatsache, dass ich verschiedene Arten von Objekten nicht trennen kann, um sie zu zwingen, verschiedene Konstruktoren zu verwenden.Verwenden von Json.NET zum Deserialisieren mehrerer Objekttypen in eine Liste

Zum Beispiel könnte ich tue dies mit 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())); 
      } 
     } 
    } 

Die erlaubte mir, eine Container-Klasse (Item) zu verwenden, um eine Vielzahl von verschiedenen Objekten zum Speichern von Daten für verschiedene Konstrukteure verwenden. Wie würde ich in Json.NET dasselbe machen? Hier

ist der Code, den ich zur Zeit bin mit:

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. 
     } 
    } 

Wie Sie sehen können, dauert es nur in einem Format von „Waffe“ (Container-Klasse, die Funktionen in der gleichen Weise wie die Item-Klasse oben gezeigt). Wie kann ich es so anders machen Konstruktoren werden abhängig von der Waffe in der JSON-Datei verwendet?

Der Grund, warum ich LitJSON nicht verwenden kann, ist, dass es keine portable Bibliothek ist, was eine Voraussetzung für alle Bibliotheken ist, die mit Duality (A C# -Spielengine) verwendet werden.

Antwort

0

Sie können eine abgeleitete JsonConverter verwenden und überschreiben die ReadJson Methode, um Ihre eigene Logik zu implementieren, und dann eine Instanz dieses Wandlers Deserialize passieren - haben einen Blick auf this answer

Auch Sie vielleicht prüfen wollen Item mit Als Basisklasse verwenden Sie abgeleitete Klassen, um Ihre verschiedenen Elemente (Food, Medicine usw.) darzustellen, anstatt eine einzelne Klasse zu verwenden, um konzeptionell unterschiedliche Objekte darzustellen.

+0

Ich werde es versuchen. Vielen Dank! – Ovicior

Verwandte Themen