2015-05-16 14 views
5

Hallo Ich arbeite an einem Windows-Formular-Anwendung in Magic The Gathering-Karten, die ich in einer Datenbank für die einfache Organisation eingeben. Um die Kartendaten schnell einzugeben, beabsichtige ich, die JSON-Datei der MTG-Masterkarte zu verwenden, die jede hergestellte Karte und alle ihre Attribute enthält. Aber die Art, wie sie die JSON-Datei haben, scheint mit der Deserialisierung in Visual C# nicht gut zu funktionieren.Jsons Deserialisierung mit verschiedenen Variablennamen (FIXED Posted Solution)

Hier ist, was zwei Einträge wie folgt aussehen:

{ 
"Air Elemental":{ 
(stuff that doesn't matter for the question) 
}, 
"Ancestral Recall":{ 
. . . 
} 
} 

Wie Sie den Variablennamen für die Daten sehen können, für jeden einzelnen unterschiedlich ist, die ist, wo das Problem liegt. Ich kann C# nicht dazu bringen, es korrekt in eine Klasse zu deserialisieren, weil es den JsonProperty-Namen haben will und weil es anders ist, kann ich es nicht wirklich setzen.

Also, wenn es eine Möglichkeit gibt, anzugeben, dass es keinen bestimmten Namen haben muss und es nur speichert, was in dieser Variable platziert ist, würde ich mich sehr freuen, wenn Sie es mir sagen könnten.

Vielen Dank für Ihre Hilfe.

SOLUTION

Dank Henrik fand ich heraus, wie dieses Problem zu beheben. Hier ist, was er gepostet:

dynamic data = JsonConvert.DeserializeObject(responseData); 
IDictionary<string, JToken> cards = data; 

foreach (var card in cards) 
{ 
    var key = card.Key; 
    var value = card.Value; 
} 

Das war nicht ganz das, was ich tun musste, aber es legte den Grund der Lösung. Ich fand heraus, dass der Card.Value tatsächlich den ganzen JSon-Text der Karte enthielt, so dass ich nur Json.DeserializeObject noch einmal verwenden musste, aber dieses Mal in meine Klasse, in der alle Werte auf Variablen gesetzt sind. Hier ist, wie es aussieht

string json; 
using (StreamReader sr = new StreamReader("G:/MTG Card Database/Files/AllCardsShort.json")) 
{ 
    json = sr.ReadToEnd(); 
    sr.Close(); 
} 

dynamic data = JsonConvert.DeserializeObject(json); 
IDictionary<string, JToken> cards = data; 

foreach (var card in cards) 
{ 
    CardData newCard = JsonConvert.DeserializeObject<CardData>(card.Value.ToString()); 
    textBox1.Text = newCard.name; //Check to see if the name can be put into a textbox 
    break; 
} 
. . . 
public class CardData 
{ 
    [JsonProperty("layout")] 
    public string layout { get; set; } 
    [JsonProperty("name")] 
    public string name { get; set; } 
    [JsonProperty("manaCost")] 
    public string manaCost { get; set; } 
    [JsonProperty("cmc")] 
    public string cmc { get; set; } 
    [JsonProperty("colors")] 
    public string[] colors { get; set; } 
    [JsonProperty("type")] 
    public string type { get; set; } 
    [JsonProperty("subtypes")] 
    public string[] subTypes { get; set; } 
    [JsonProperty("text")] 
    public string text { get; set; } 
    [JsonProperty("power")] 
    public string power { get; set; } 
    [JsonProperty("toughness")] 
    public string toughness { get; set; } 
    [JsonProperty("imageName")] 
    public string imageName { get; set; } 
} 

Also noch einmal vielen Dank Henrik für die Hilfe. Und danke an alle anderen, die auch ihre Idee gepostet haben!

+0

Haben Sie versucht, einen 'Wörterbuch '? –

+0

http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object –

Antwort

4

Mit Json.NET:

dynamic data = JsonConvert.DeserializeObject(responseData); 
IDictionary<string, JToken> cards = data; 

foreach (var card in cards) 
{ 
    var key = card.Key; 
    var value = card.Value; 
} 
+0

Vielen Dank, das hat perfekt funktioniert! Musste nur die Karte deserialize.Value in die CardData. Nochmals vielen Dank! – nickqqqq1

0

Könnte das das sein wonach Sie suchen? Prüfen Tom Peplow Antwort hier

Deserialize JSON into C# dynamic object?

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }"); 

string name = stuff.Name; 
string address = stuff.Address.City;