2016-05-17 1 views
1

J'essaie d'accéder aux tags individuels de l'API Web JSON. si vous regardez mon message de débogage vous pouvez voir que chaque balise est affichée avec les données correctes dans « jsonMessage », mais quand je reviens « résultat » chaque balise est définie sur null:C# - Appelez l'API Web JSON et obtenez des données

Debug message

Alors, comment je obtenir toutes les balises de jsonMessage revenir donc je peux taper par exemple texblock.text = card.name; et ainsi de suite

public async static Task<Card> GetCard() 
{ 
    string url = String.Format("https://api.magicthegathering.io/v1/cards/386616"); 

    HttpClient client = new HttpClient(); 
    //client.BaseAddress = new Uri(url); 

    var response = await client.GetAsync(url); 

    var jsonMessage = await response.Content.ReadAsStringAsync(); 
    var serializer = new DataContractJsonSerializer(typeof(Card)); 
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonMessage)); 

    var result = (Card)serializer.ReadObject(ms); 
    return result; 
} 

Voici la classe Cartes:

public class Card 
{ 
    public string name { get; set; } 
    public string manaCost { get; set; } 
    public int cmc { get; set; } 
    public List<string> colors { get; set; } 
    public string type { get; set; } 
    public List<string> types { get; set; } 
    public List<string> subtypes { get; set; } 
    public string rarity { get; set; } 
    public string set { get; set; } 
    public string text { get; set; } 
    public string artist { get; set; } 
    public string number { get; set; } 
    public string power { get; set; } 
    public string toughness { get; set; } 
    public string layout { get; set; } 
    public int multiverseid { get; set; } 
    public string imageUrl { get; set; } 
    public List<Ruling> rulings { get; set; } 
    public List<ForeignName> foreignNames { get; set; } 
    public List<string> printings { get; set; } 
    public string originalText { get; set; } 
    public string originalType { get; set; } 
    public List<Legality> legalities { get; set; } 
    public string id { get; set; } 
} 

Répondre

1

désérialiser correctement votre objet Card doit être dans un objet qui a une propriété de type Card. J'ai recréé les classes en utilisant JsonUtils Pas que ce soit nécessaire mais je préfère avoir les attributs pour pouvoir renommer librement les propriétés sans me soucier de casser la sérialisation/désérialisation. J'ai également mis à jour l'extrait de code fonctionne correctement:

[DataContract] 
public class Ruling 
{ 

    [DataMember(Name = "date")] 
    public string Date { get; set; } 

    [DataMember(Name = "text")] 
    public string Text { get; set; } 
} 

[DataContract] 
public class ForeignName 
{ 

    [DataMember(Name = "name")] 
    public string Name { get; set; } 

    [DataMember(Name = "language")] 
    public string Language { get; set; } 

    [DataMember(Name = "multiverseid")] 
    public int Multiverseid { get; set; } 
} 

[DataContract] 
public class Legality 
{ 

    [DataMember(Name = "format")] 
    public string Format { get; set; } 

    [DataMember(Name = "legality")] 
    public string LLegality { get; set; } 
} 

[DataContract] 
public class Card 
{ 

    [DataMember(Name = "name")] 
    public string Name { get; set; } 

    [DataMember(Name = "manaCost")] 
    public string ManaCost { get; set; } 

    [DataMember(Name = "cmc")] 
    public int Cmc { get; set; } 

    [DataMember(Name = "colors")] 
    public IList<string> Colors { get; set; } 

    [DataMember(Name = "type")] 
    public string Type { get; set; } 

    [DataMember(Name = "supertypes")] 
    public IList<string> Supertypes { get; set; } 

    [DataMember(Name = "types")] 
    public IList<string> Types { get; set; } 

    [DataMember(Name = "subtypes")] 
    public IList<string> Subtypes { get; set; } 

    [DataMember(Name = "rarity")] 
    public string Rarity { get; set; } 

    [DataMember(Name = "set")] 
    public string Set { get; set; } 

    [DataMember(Name = "text")] 
    public string Text { get; set; } 

    [DataMember(Name = "artist")] 
    public string Artist { get; set; } 

    [DataMember(Name = "number")] 
    public string Number { get; set; } 

    [DataMember(Name = "power")] 
    public string Power { get; set; } 

    [DataMember(Name = "toughness")] 
    public string Toughness { get; set; } 

    [DataMember(Name = "layout")] 
    public string Layout { get; set; } 

    [DataMember(Name = "multiverseid")] 
    public int Multiverseid { get; set; } 

    [DataMember(Name = "imageUrl")] 
    public string ImageUrl { get; set; } 

    [DataMember(Name = "watermark")] 
    public string Watermark { get; set; } 

    [DataMember(Name = "rulings")] 
    public IList<Ruling> Rulings { get; set; } 

    [DataMember(Name = "foreignNames")] 
    public IList<ForeignName> ForeignNames { get; set; } 

    [DataMember(Name = "printings")] 
    public IList<string> Printings { get; set; } 

    [DataMember(Name = "originalText")] 
    public string OriginalText { get; set; } 

    [DataMember(Name = "originalType")] 
    public string OriginalType { get; set; } 

    [DataMember(Name = "legalities")] 
    public IList<Legality> Legalities { get; set; } 

    [DataMember(Name = "id")] 
    public string Id { get; set; } 
} 

[DataContract] 
public class ApiResult 
{ 

    [DataMember(Name = "card")] 
    public Card Card { get; set; } 
} 

Et voici le code désérialisation:

var response = await client.GetAsync(url); 

var jsonMessage = await response.Content.ReadAsStringAsync(); 
var serializer = new DataContractJsonSerializer(typeof(ApiResult)); 
ApiResult result; 
// Disposing of the MemoryStream after the serialization to save 
// some memory space 
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonMessage))) 
{ 
    result = (ApiResult) serializer.ReadObject(ms); 
} 

Maintenant, vous pouvez utiliser:

texblock.text = result.Card.name; 

D'un côté note de votre devrait Pensez à utiliser Json.Net au lieu du désérialiseur .Net par défaut car il est plus rapide et possède bien plus de fonctionnalités.

1

Bonjour cherchant le résultat de votre appel, vous devez l'envelopper dans un objet résultat.

public class CardResult 
{ 
    public Card card { get; set; } 
}