2016-06-01 15 views
0
public static void apiCall2() 
{ 
    WebClient c = new WebClient(); 
    var data = c.DownloadString(baseURL + endPoint + "?access_key=" + accessKey + "&currencies=TWD&source=USD&format=1"); 
    //Console.WriteLine(data); 
    JObject api = JObject.Parse(data); 

    string conversion = ""; 

    foreach (var result in api["quotes"]) 
    { 
     System.Console.WriteLine(result); 
     conversion = (string)result["USDTWD"]; 
     System.Console.WriteLine(conversion); 
    } 
} 

Если когда-нибудь я запускаю этот простой код JSON API вызова я получаю ошибкуДоступ к ребенку значение JSON в C#

не удается получить доступ к стоимости ребенка на Newtonsoft.Json.Linq.JProperty.

USDTWD (единственный раздел внутри [цитата], как предполагается назвать двойной, который возвращает обменный курс доллара США к TWD, и даже пытается вызвать его в виде строки, кажется, не поможет.

+0

Можете ли вы дать некоторые образцы ответа? –

+0

Вот ссылка на файл JSON, который он вызывает. Все, что я пытаюсь сделать, это получить USDTWD как двойной. http://apilayer.net/api/live?access_key=88ac736de70eaf00263ab52afe0de9b0¤cies=TWD&source=USD&format=1 – Moyni

ответ

1

Когда вы звоните foreach (var result in api["quotes"]) вы зацикливание над дочерними объектами «цитата» JObject один из которых является JProperty со свойством имя «USDTWD». Затем вы помещаете это значение JProperty в переменную result. Тогда здесь:

conversion = (string)result["USDTWD"] 

вы пытаетесь получить доступ к USDTWD свойства result но result не имеет USDTWD свойства, потому что этоUSDTWD свойства. Отсюда исключение.

Если вам просто нужно значение USDTWD собственности вы можете заменить цикл Еогеасп с этим:

conversion = api["quotes"]["USDTWD"].ToString(); 
+0

Ну, на самом деле он может, вероятно, просто использовать результат напрямую, если он хочет перебрать все? –

+0

@IlyaChernomordik - Он мог использовать 'result' напрямую. Если 'quotes' имеет более одного свойства, то использование' result' в цикле foreach может иметь смысл. Однако, на основании приведенного выше примера, похоже, что это не так. Я бы полностью отказался от цикла и просто захватил единственное значение напрямую. –

1

у меня есть предположение, что может помочь вам решить эту проблему с помощью класса со структурой, а не «сырой» JObject Если вы создаете класс, как этот:.

public class ResponseModel 
{ 
    public bool Success {get;set;} 
    .... 

    public List<Quote> Quotes {get;set;} 
} 

public class QuoteModel 
{ 
    public decimal USDTWD {get;set;} 
} 

Затем вы можете преобразовать к этому объекту например:

var response = api.ToObject<ResponseModel>(); 

Я не уверен, что это приемлемо для вас (например, у вас могут не быть всех разных котировок, или они не все перечислены). Но обычно это более удобный способ работы с ответами, чем использование JObject прямо на мой взгляд.

P.S. Возможно, вы даже можете иметь свойство List as Quotes, чтобы не жестко кодировать его, но я не уверен, как он поддерживается.

2

Легкий способ:

Изменение: JObject api = JObject.Parse(data); To:

dynamic api = JObject.Parse(data); 
var quote = api.quotes.USDTWD; 
Смежные вопросы