2016-05-17 6 views
1

Я пытаюсь получить доступ к отдельным тегам из Json Web API. если вы посмотрите на мою Debug сообщение, которое вы можете увидеть, что каждый тег отображается с правильными данными в «jsonMessage», но когда я возвращать «результат» каждый тег устанавливается в нуль:C# - Позвонить в JSON Web API и получить данные

Debug message

Так как я получить все теги из jsonMessage вернуться, так что я могу просто ввести, например texblock.text = card.name; и так далее

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

Вот класс карты:

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

ответ

1

десериализации правильно ваш Card объект должен быть в объекте, который имеет свойство типа Card. Я воссоздал классы, используя JsonUtils Не то, чтобы это было необходимо, но я предпочитаю иметь атрибуты, чтобы я мог свободно переименовывать свойства, не беспокоясь о нарушении сериализации/десериализации. Я также обновил свой фрагмент кода для правильной работы:

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

А вот код десериализации:

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

Теперь вы можете использовать:

texblock.text = result.Card.name; 

На стороне записки ваши должны рассмотрите возможность использования Json.Net вместо стандартного десериализатора .Net, потому что он быстрее и имеет больше возможностей.

1

Привет, глядя на результат вашего вызова, вы должны перенести его в объект результата.

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

 Смежные вопросы

  • Нет связанных вопросов^_^