Прочитайте объект json и найдите в нем значение

У меня есть следующий запрос GET:

string url = @"http://api.flexianalysis.com/services/flexianalysisservice.svc/TechnicalAnalysisByCategory?clientid=___&category=forex&key=____";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.AutomaticDecompression = DecompressionMethods.GZip;

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        using (Stream stream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream))
        {
             rawJson = new StreamReader(response.GetResponseStream()).ReadToEnd();
            //html = reader.ReadToEnd();
        }

Это пример JSON:

[{"ID":133739,"TickerID":23,"CategoryID":3,"ClientID":5044,"TickerDateTime":"2017-11-06T12:57:19.267","TickerTitle":"AUD/USD Intraday: key resistance at 0.7670.\r\n","Category":"Forex","TradePairName":"AUD/USD","Ticker":"AUD","TrendType":"THE upside prevails","Status":"Enabled","TrendValue1":"+1","PivotValue":0.767,"OurPreference":"v: short positions below 0.7670 with targets at 0.7635 & 0.7615 in extension.\r\n","AlternateScenario":"o: above 0.7670 look for further upside with 0.7695 & 0.7715 as targets.\r\n","Comments":" as long as 0.7670 is resistance, look for choppy price action with a bearish bias.\r\n","S1":0.7635,"S2":0.7615,"S3":0.7595,"R1":0.767,"R2":0.7695,"R3":0.7715,"Entry":0.0,"Stop":0.0,"T1":0.0,"T2":0.0},{"ID":133738,"TickerID":193,"CategoryID":3,"ClientID":5044,"TickerDateTime":"2017-11-06T12:55:54.33","TickerTitle":"Dollar Index‏ (ICE) Intraday: bullish bias above 94.8000.\r\n","Category":"Forex","TradePairName":"Dollar Index (ICE)","Ticker":"DXA","TrendType":"THE upside prevails","Status":"Enabled","TrendValue1":"+1""PivotValue":94.8,"OurPreference":": long positions above 94.8000 with targets at 95.1500 & 95.3000 in extension.\r\n","AlternateScenario":"below 94.8000 look for further downside with 94.6500 & 94.4500 as targets.\r\n","Comments":": the RSI lacks downward momentum.","S1":94.8,"S2":94.65,"S3":94.45,"R1":95.15,"R2":95.3,"R3":95.45,"Entry":0.0,"Stop":0.0,"T1":0.0,"T2":0.0}]

Затем я пытаюсь разобрать его в JSON и удалить «d» в начале:

var json = JObject.Parse(rawJson);
        var filter = json["d"];
        var fff = filter["ID"];//Get the error here

Теперь я хочу прочитать идентификатор, но по какой-то причине он выдает ошибку, что не может получить доступ к дочернему узлу. Есть идеи, почему?


person Igal C    schedule 06.11.2017    source источник
comment
Пожалуйста, объясните, в какой строке вы получаете сообщение об ошибке и точное сообщение об ошибке.   -  person Steve    schedule 06.11.2017
comment
Является ли запрос key и clientId частным для вашего использования? Если это так, пожалуйста, отметьте моды, чтобы удалить их из истории редактирования.   -  person Icepickle    schedule 06.11.2017
comment
@Icepickle Уже отмечен;)   -  person Zhaph - Ben Duguid    schedule 06.11.2017
comment
Вы только что опубликовали свой идентификатор клиента и ключ доступа? Вам необходимо немедленно аннулировать их и запросить новый ключ доступа. Все могут видеть правки и старую историю. Даже если модераторы отредактируют историю здесь, вероятно, достаточно людей уже видели ее, чтобы сделать ее проблемой безопасности. Вы не хотите быть тем парнем, который слил конфиденциальные данные незнакомцам в Интернете.   -  person Lasse V. Karlsen    schedule 06.11.2017
comment
На настоящий вопрос нельзя ответить, потому что никто здесь не знает, что значит удалить букву «d» в начале. Вам нужно опубликовать пример json, который вы хотите обработать, и объяснить, какую обработку вы хотите. Что касается сообщения об ошибке, вам необходимо опубликовать это сообщение об ошибке вместе с фактическим кодом, который его создает.   -  person Lasse V. Karlsen    schedule 06.11.2017
comment
Если вы получаете сообщение об ошибке в этой строке, это означает, что JSON не соответствует ожидаемому, и мы не можем помочь, не зная, как выглядят данные JSON.   -  person crashmstr    schedule 06.11.2017
comment
Я добавил соответствующие данные   -  person Igal C    schedule 06.11.2017
comment
@LasseVågsætherKarlsen — ответ JSON от сервера ASP.NET часто возвращается с сервера как дочерний элемент объекта {d: {[actualObjectHere]}} Это было введено еще в .NET 3.5 для защиты от некоторых атак XSS.   -  person Zhaph - Ben Duguid    schedule 06.11.2017
comment
@IgalC Пожалуйста, прекратите включать свой ключ в вопрос - это конфиденциальная, личная информация, которую вы не должны размещать на общедоступном веб-сайте.   -  person Zhaph - Ben Duguid    schedule 06.11.2017
comment
Возможный дубликат Json Deserialization, анализирующий недопустимый объект Json   -  person Zhaph - Ben Duguid    schedule 06.11.2017


Ответы (1)


Я думаю, вам нужно проверить несколько ваших предположений и попробовать несколько точек останова.

Глядя на JSON, возвращаемый этим API, кажется, что он плохо сформирован, и на самом деле вы получаете массив JSON в виде строки:

{"d":"[{\"ID\":133739,\"TickerID\":23,\"CategoryID\":3,...}},
       {\"ID\":133740,\"TickerID\":23,\"CategoryID\":3,...}},
       [...]}]"}

Таким образом, чтобы разобрать его, вам сначала нужно получить значение из параметра d, а затем разобрать его в массив:

// Get the response from the server
using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
{
    // Pass the response into a stream reader
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        // Grab the JSON response as a string
        string rawJson = reader.ReadToEnd();

        // Parse the string into a JObject
        var json = JObject.Parse(rawJson);

        // Get the JToken representing the ASP.NET "d" parameter
        var d = json.GetValue("d");

        // Parse the string value of the object into a jArray
        var jArray = JArray.Parse(d.ToString());

        // At this point you can start looking for the items.
    }
}
person Zhaph - Ben Duguid    schedule 06.11.2017