【发布时间】:2022-12-07 06:15:57
【问题描述】:
`` 我正在尝试按照其市值排名订购要交易的代币向量。它可以完美编译并运行,但在运行时抛出错误 3。代码在下面找到。
调试:json.hpp 抛出未处理的异常 MyProgram.exe 中 0x0000500000000000 处的未处理异常:Microsoft C++ 异常:内存位置 0x000000E000000000 处的 nlohmann::json_abi_v3_11_2::detail::type_error。
JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j));
期望的结果:在从 api 请求市值排名后,将我的硬币向量从最高市值排序到最低。并列出终端的向量。
交易.cpp
#include <string>
#include <iostream>
#include <vector>
#include <cpr/cpr.h>
#include <nlohmann/json.hpp>
#include "trading.h"
// for convenience
using json = nlohmann::json;
using namespace cpr;
using namespace std;
//orders the coins from 1-20 ascending order
void trading::order(){
//variables
vector<string> coinsCopy;
int rankOrder = 0;
//order coing by market cap
string base = "https://api.coingecko.com/api/v3/search?query=";
string id;
//makes a copy of coins
for (int k = 0; k < coins.size(); k++) {
coinsCopy.push_back(coins[k]);
}
for (int i = 0; i < coins.size(); i++) {
//loop variables
string id = coins[i];
auto search = Get(Url{ base + id });
json data = json::parse(search.text);
//collects rank
for (json& item : data["coins"]) {
rankOrder = item["market_cap_rank"];
if (rankOrder > coins.size()) {
rankOrder = coins.size();
}
break;
}
//updates coins to correct order in coins copy
coinsCopy.at(rankOrder) = coins[i];
}
//updates main coin vector with correct rank order
for (int ii = 0; ii < coins.size(); ii++) {
coins.at(rankOrder) = coinsCopy[ii];
}
}
void trading::listOrder() {
for (int j = 0; j < coins.size(); j++) {
cout << "Coin Ranked # " << j << ": " << coins[j] << endl;
}
}
主.cpp
#include <cpr/cpr.h>
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
#include <vector>
#include "trading.h"
// for convenience
using json = nlohmann::json;
using namespace cpr;
using namespace std;
int main() {
trading trade;
trade.order();
trade.listOrder();
}
JSON 文件样本
{"coins":[{"id":"bitcoin","name":"Bitcoin","api_symbol":"bitcoin","symbol":"BTC","market_cap_rank":1,"thumb":"https://assets.coingecko.com/coins/images/1/thumb/bitcoin.png","large":"https://assets.coingecko.com/coins/images/1/large/bitcoin.png"},
【问题讨论】:
-
请将您的代码缩减为minimal reproducible example。正如消息告诉您的那样,您正在尝试将某些内容解析为不是数字的数字。通过删除部分,应该不难找出 JSON 的哪一部分导致了这种情况。此外,您程序中的很多内容与解析问题无关并阻碍了可重复性(例如,用文字中的测试 JSON 替换查询)。
-
那么,您是否尝试过使用调试器单步执行代码以了解抛出异常的原因?
-
json 数据 = json::parse(search.text); //这是抛出异常的地方。为什么在上面的实际问题中列出。
标签: c++ nlohmann-json coingecko