2015-05-16 10 views
5

Witam Pracuję nad aplikacją aplikacji Windows, aby wprowadzić karty Magic The Gathering do bazy danych w celu ułatwienia organizacji. W celu szybkiego wprowadzenia danych karty planuję użyć pliku Json karty głównej MTG, który zawiera każdą wyprodukowaną kartę i wszystkie jej atrybuty. Ale sposób, w jaki mają plik Json nie wydaje się działać dobrze z deserializacji w Visual C#.deserializacja Json z różnymi nazwami zmiennych (POPRAWIONO Wysłane rozwiązanie)

Oto co dwa wpisy wyglądać następująco:

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

Jak widać zmienna nazwa danych jest różna dla każdej jednej czyli tam, gdzie leży problem. Nie mogę uzyskać C#, aby poprawnie przekształcić go w klasę, ponieważ chce nazwy JsonProperty i ponieważ jest inna, nie mogę jej ustawić.

Więc jeśli istnieje sposób na określenie, że nie trzeba mieć określonej nazwy i po prostu zapisuje to, co jest umieszczone w tej zmiennej, byłbym bardzo wdzięczny, gdybyś mógł mi powiedzieć.

Dziękujemy za udzielenie pomocy.

ROZWIĄZANIE

Dzięki Henrik I okazało się, jak rozwiązać ten problem. Oto, co zamieścił:

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

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

Co nie było w pełni tym, co musiałem zrobić, ale stanowiło podstawę rozwiązania. Stwierdziłem, że karta. Wartość faktycznie zawiera cały tekst karty JSONA, więc wszystko, co musiałem zrobić, to użyć Json.DeserializeObject jeszcze raz, ale tym razem do mojej klasy, która ma wszystkie wartości ustawione na zmienne. Oto, jak to wygląda:

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

Jeszcze raz dziękuję Henrik za pomoc. I dziękuję wszystkim, którzy również napisali swój pomysł!

+0

Czy próbowałeś od '' słownik ? –

+0

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

Odpowiedz

4

Tom Peplow Korzystanie 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

Dziękuję bardzo, że działało idealnie! Właśnie musiałem deserializować kartę. Wartość do CardData. Jeszcze raz dziękuję! – nickqqqq1

0

Czy to może być to, czego szukasz? Sprawdzić odpowiedź tutaj

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; 
Powiązane problemy