xXH4CKST3RXx Ответов: 2

Проблема форматирования JSON с API в javascript


var request = new XMLHttpRequest()

request.open('GET', 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demo', true)
request.onload = function() {
  // Begin accessing JSON data here
  var data = JSON.parse(this.response)
  console.log(data)
}

request.send()


Я работал с API Alpha Vantage, чтобы получить биржевые данные, но то, как они форматируют свои данные, делает их почти невозможными для доступа. Я использую демонстрационные данные, потому что не хочу использовать свой собственный ключ API из-за ограничений, которые они накладывают.
Они помещают имена свойств объектов в строки, и обычно в строке содержится более одного слова. Это мешает мне получить доступ к собственности после того, как я использую JSON.parse() потому что использование JSON.parse() приводит к тому, что имена свойств объекта не являются строками, а просто именами свойств, что отключает мой доступ к отдельному свойству, поскольку имена свойств объекта не могут быть более чем одним словом, если только имена не являются строками.
Поэтому API не позволяет мне получить доступ к данным объекта. Я использую JSON.parse() потому что если бы я этого не сделал, то ответ, который я получаю от API, - это сама строка, которую я не могу использовать. Я пытаюсь найти альтернативу этому JSON.parse() это преобразует строку со всеми данными объекта внутри нее в обычный объект, но обычный объект все еще сохраняет имена свойств, которые являются строками.

Вот что я получаю обратно после того, как использую JSON.parse():

{
Meta Data: {
1. Information:"Daily Prices (open, high, low, close) and Volumes",
2. Symbol:"MSFT",
3. Last Refreshed:"2019-09-24",
4. Output Size:"Compact",
5. Time Zone:"US/Eastern"
},
Time Series (Daily): {
2019-09-24: {
1. open:"140.3600",
2. high:"140.6900",
3. low:"136.8850",
4. close:"137.3800",
5. volume:"24602078"
},
2019-09-23: {
1. open:"139.2300",
2. high:"139.6300",
3. low:"138.4400",
4. close:"139.1400",
5. volume:"17139300"
},
2019-09-20: {
1. open:"141.0100",
2. high:"141.6500",
3. low:"138.2500",
4. close:"139.4400",
5. volume:"39167300"
},
2019-09-19: {
1. open:"140.3000",
2. high:"142.3700",
3. low:"140.0700",
4. close:"141.0700",
5. volume:"35772100"
     }
  }
}


Если я не использую JSON.parse(), в результате получается вот что:
'{
    "Meta Data": {
        "1. Information": "Daily Prices (open, high, low, close) and Volumes",
        "2. Symbol": "MSFT",
        "3. Last Refreshed": "2019-09-24",
        "4. Output Size": "Compact",
        "5. Time Zone": "US/Eastern"
    },
    "Time Series (Daily)": {
        "2019-09-24": {
            "1. open": "140.3600",
            "2. high": "140.6900",
            "3. low": "136.8850",
            "4. close": "137.3800",
            "5. volume": "24602078"
        },
        "2019-09-23": {
            "1. open": "139.2300",
            "2. high": "139.6300",
            "3. low": "138.4400",
            "4. close": "139.1400",
            "5. volume": "17139300"
        },
        "2019-09-20": {
            "1. open": "141.0100",
            "2. high": "141.6500",
            "3. low": "138.2500",
            "4. close": "139.4400",
            "5. volume": "39167300"
        },
        "2019-09-19": {
            "1. open": "140.3000",
            "2. high": "142.3700",
            "3. low": "140.0700",
            "4. close": "141.0700",
            "5. volume": "35772100"
        }
    }
}


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

Что я уже пробовал:

Я пробовал использовать JSON.parse (), но это не сработало.

MadMyche

Можете ли вы предоставить образец данных, которые вы получаете обратно? Судя по вашему описанию то что они посылают обратно действительно

F-ES Sitecore

google "alphavantage javascript", и вы найдете клиентские библиотеки и примеры кода, которые анализируют данные.

[no name]

Я предоставил образец данных.

2 Ответов

Рейтинг:
2

A_Griffin

Возможно, вы захотите посмотреть на функцию receiver в JSON.parse - для примера trvial, чтобы получить часовой пояс в вашем примере

 var json = '{"Meta Data": {"1. Information": "Daily Prices (open, high, low, close) and Volumes","2. Symbol": "MSFT","3. Last Refreshed": "2019-09-24","4. Output Size": "Compact","5. Time Zone": "US/Eastern"},"Time Series (Daily)": {"2019-09-24": {"1. open": "140.3600","2. high": "140.6900","3. low": "136.8850","4. close": "137.3800","5. volume": "24602078"},"2019-09-23": {"1. open": "139.2300","2. high": "139.6300","3. low": "138.4400","4. close": "139.1400","5. volume": "17139300"},"2019-09-20": {"1. open": "141.0100","2. high": "141.6500","3. low": "138.2500","4. close": "139.4400","5. volume": "39167300"},"2019-09-19": {"1. open": "140.3000","2. high": "142.3700","3. low": "140.0700","4. close": "141.0700","5. volume": "35772100"}}}';

 var obj = JSON.parse(json, function (key, value) {
    if (key == "5. Time Zone") {
       alert(value);
    }
    return value;
});
будет отображаться предупреждение с надписью "US/Eastern".


Рейтинг:
1

Richard Deeming

Это не очень дружелюбный формат, но это вполне допустимый JSON, и JSON.parse с этим проблем не будет.

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

var symbol = obj.MetaData.Symbol;
вы бы использовали:
var symbol = obj["Meta Data"]["2. Symbol"];