2016-05-05 2 views
4

В настоящее время вы пытаетесь работать с API fixer.io, чтобы создать конвертацию валюты на C#.Невозможно преобразовать тип 'Newtonsoft.Json.Linq.JProperty' в 'Newtonsoft.Json.Linq.JObject'

Я использовал подобный метод ниже, анализируя JSON из API twitter и без проблем работал, я не совсем уверен, что происходит здесь.

Пример JSON вернулся из API:

{ 
    "base": "EUR", 
    "date": "2016-05-05", 
    "rates": { 
     "AUD": 1.5266, 
     "BGN": 1.9558, 
     "BRL": 4.0282, 
     "CAD": 1.4665, 
     "CHF": 1.1018, 
     "CNY": 7.441, 
     "CZK": 27.028, 
     "DKK": 7.4401, 
     "GBP": 0.7886, 
     "HKD": 8.8775, 
     "HRK": 7.515, 
     "HUF": 312.84, 
     "IDR": 15260.95, 
     "ILS": 4.3221, 
     "INR": 76.0745, 
     "JPY": 122.51, 
     "KRW": 1333.95, 
     "MXN": 20.2155, 
     "MYR": 4.5819, 
     "NOK": 9.2985, 
     "NZD": 1.6577, 
     "PHP": 54.171, 
     "PLN": 4.4234, 
     "RON": 4.5035, 
     "RUB": 75.0559, 
     "SEK": 9.2575, 
     "SGD": 1.5531, 
     "THB": 40.191, 
     "TRY": 3.3166, 
     "USD": 1.1439, 
     "ZAR": 17.0751 
    } 
} 

А вот код, который я в настоящее время работает с:

 List<string> exchangeRate = new List<string>(); 
     string BSE = "USD"; 
     string URL = "http://api.fixer.io/latest?base=" + BSE; 

     using (var webClient = new System.Net.WebClient()) 
     { 
      var json = webClient.DownloadString(URL); 
      dynamic stuff = JsonConvert.DeserializeObject(json); 

      foreach (JObject item in stuff) 
      { 
       exchangeRate.Add(item["rates"].ToString()); 

       foreach (var rates in exchangeRate) 
       { 
        Console.WriteLine(rates); 
       } 
      } 
     } 

Теперь ошибка, я получаю это:

Невозможно преобразовать тип «Newtonsoft.Json.Linq.JProperty» в «Newtonsoft.Json.Linq.JObject»

Это происходит в «JObject пункта»

ответ

1

В коде JsonConvert.DeserializeObject() возвращается в JObject в динамическую переменную stuff. Когда вы используете foreach для перебора по JObject, перечисляемые элементы всегда являются JProperty экземплярами, а не JObject экземплярами. Поскольку JProperty не является подклассом JObject, вы не можете назначить его переменной JObject, и именно поэтому вы получаете эту ошибку.

Если вы просто пытаетесь распечатать все курсы валют на консоль, вы можете сделать это следующим образом:

JObject stuff = JObject.Parse(json); 

foreach (JProperty rate in stuff["rates"]) 
{ 
    Console.WriteLine(rate.Name + ": " + rate.Value); 
} 

Fiddle: https://dotnetfiddle.net/fpS9CM

2

Вы можете попробовать что-то вроде этого:

foreach (JProperty item in stuff) 
{ 
    if (item.Name == "rates") 
    { 
     exchangeRate.AddRange(from rate in item from xch in rate select xch.ToString()); 
     foreach (var value in exchangeRate) 
     { 
      Console.WriteLine(value); 
     } 
    } 
} 

JToken является общим представлением значения JSON любого рода. Это может быть строка, объект, массив, свойство и т. Д.

A JProperty - это одно значение JToken в паре с именем. Он может быть добавлен только в JObject, и его значение не может быть другим JProperty.

A JObject - это коллекция JProperties. Он не может напрямую использовать какой-либо другой JToken.

3

Если вы используете сильно типизированный объект, соответствующий вашему Json, вам будет легче работать с тем, что вы deserialized. Попробуйте следующее:

public class ConversionRates 
{ 
    public string @base { get; set; } 
    public string date { get; set; } 
    public Dictionary<string, decimal> rates { get; set; } 
} 

Затем десериализуйте это.

var obj = JsonConvert.DeserializeObject<ConversionRates>(yourJson); 
Смежные вопросы