2016-10-24 5 views
1

У меня есть небольшая проблема с программой C#. Это моя первая программа на C#, поэтому, пожалуйста, прощайте :)C# Deserialize JSON для объекта

Я хотел бы десериализовать свой json-файл в объект, но я не знаю, как должен строиться мой класс. Я использую Newtonsoft JSON lib.

JSON файл:

http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json


Form1.cs:

private void button1_Click(object sender, EventArgs e) 
    { 
     CurrencyCodeValues k = new CurrencyCodeValues(); 
     WebClient myWebClient = new WebClient(); 
     dynamic result = myWebClient.DownloadString("http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json"); 
     IList<CurrencyCodeValues> m = JsonConvert.DeserializeObject<CurrencyCodeValues>(result); 
    } 

Class1.cs:

сообщение
class CurrencyCodeValues 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public List<rates_> rates { get; set; } 

} 

public class rates_ 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 

Ошибки:

Не может десериализации текущего массива JSON (например, [1,2,3]) в тип «WindowsFormsApplication4.CurrencyCodeValues», потому что для десериализации корректно требуется тип JSON (например, {«name»: «value»}). Чтобы исправить эту ошибку, либо смените JSON на объект JSON (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList), например List, можно десериализовать из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON. Путь '', строка 1, позиция 1.

+0

Просто написать эту CurrencyCodeValues ​​м = JsonConvert.DeserializeObject (результат); –

ответ

1

В сообщении об ошибке предложить ваш класс должен выглядеть следующим образом

public class Rootobject 
{ 
    public Class1[] Property1 { get; set; } 
} 

public class Class1 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public Rate[] rates { get; set; } 
} 

public class Rate 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 

, а затем deseralize его как

JsonConvert.DeserializeObject<Rootobject>(result); 
0

в то время как deserialising JSON вам нужно использовать базовые структуры и пользовательские кланы, потому что json не поддерживает списки, карты и другие структуры, которые хранят данные и делают некоторые логики. это означает, что вы не можете использовать List<rates_> вам нужно использовать rates_[]

также, как мотивационные Мохит Shrivastava - вам нужно добавить класс Wrapper, потому что Yout запрос возвращает массив CurrencyCodeValues объектов, не один объект

1

Если вы не уверены, как ваша модель класса должна выглядеть так, чтобы соответствовать определенной структуре json, Visual Studio (так как VS2013 Update 2) имеет весьма полезную функцию. Вы можете скопировать строку json, перейти в Visual Studio, а затем щелкнуть Edit -> Paste Special -> Paste JSON As Classes.
Теперь Visual Studio будет составлять модель подходящего класса.


В вашем случае это будет выглядеть следующим образом (как Мохит Shrivastava уже предложили):

public class Rootobject 
{ 
    public Class1[] Property1 { get; set; } 
} 

public class Class1 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public Rate[] rates { get; set; } 
} 

public class Rate 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 
Смежные вопросы