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.
Ich werde es versuchen. Vielen Dank! – Ovicior