在 C++ 中格式化 JSON
Format JSON in C++
我正在尝试使用 nlohmann/json 库在 C++ 中解析 JSON。但是这个库无法解析未格式化的 JSON.
我收到一个错误:
libc++abi.dylib: terminating with uncaught exception of type nlohmann::detail::parse_error: [json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - unexpected end of input; expected '[', '{', or a literal
这个JSON给我一个错误:
{"1":{"row":{"last":"1.1857","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"1.1857","summaryName":"EUR\/USD","summaryNameAlt":"EUR\/USD - Euro US Dollar","summaryChange":"+0.0056","summaryChangePercent":"+0.48","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":2,"maSell":10,"tiBuy":0,"tiSell":7,"updateTime":null,"link":"\/currencies\/eur-usd"},"2":{"row":{"last":"1.3109","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"1.3109","summaryName":"GBP\/USD","summaryNameAlt":"GBP\/USD - British Pound US Dollar","summaryChange":"+0.0049","summaryChangePercent":"+0.37","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":0,"maSell":12,"tiBuy":0,"tiSell":7,"updateTime":null,"link":"\/currencies\/gbp-usd"},"3":{"row":{"last":"105.64","ma":"Strong Buy","ma_class":"greenFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"downArrow","summaryLast":"105.64","summaryName":"USD\/JPY","summaryNameAlt":"USD\/JPY - US Dollar Japanese Yen","summaryChange":"-0.07","summaryChangePercent":"-0.06","summaryChangeClass":"redFont","technicalSummary":"Strong Buy","technicalSummaryClass":"buy","maBuy":12,"maSell":0,"tiBuy":9,"tiSell":0,"updateTime":null,"link":"\/currencies\/usd-jpy"},"5":{"row":{"last":"0.7189","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"0.7189","summaryName":"AUD\/USD","summaryNameAlt":"AUD\/USD - Australian Dollar US Dollar","summaryChange":"+0.0029","summaryChangePercent":"+0.40","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":0,"maSell":12,"tiBuy":0,"tiSell":8,"updateTime":null,"link":"\/currencies\/aud-usd"},"7":{"row":{"last":"1.3278","ma":"Buy","ma_class":"greenFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"downArrow","summaryLast":"1.3278","summaryName":"USD\/CAD","summaryNameAlt":"USD\/CAD - US Dollar Canadian Dollar","summaryChange":"-0.0039","summaryChangePercent":"-0.29","summaryChangeClass":"redFont","technicalSummary":"Buy","technicalSummaryClass":"buy","maBuy":11,"maSell":1,"tiBuy":3,"tiSell":3,"updateTime":null,"link":"\/currencies\/usd-cad"},"9":{"row":{"last":"125.25","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"125.25","summaryName":"EUR\/JPY","summaryNameAlt":"EUR\/JPY - Euro Japanese Yen","summaryChange":"+0.51","summaryChangePercent":"+0.40","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":2,"maSell":10,"tiBuy":0,"tiSell":9,"updateTime":null,"link":"\/currencies\/eur-jpy"},"10":{"row":{"last":"1.0777","ma":"Strong Buy","ma_class":"greenFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"1.0777","summaryName":"EUR\/CHF","summaryNameAlt":"EUR\/CHF - Euro Swiss Franc","summaryChange":"+0.0003","summaryChangePercent":"+0.03","summaryChangeClass":"greenFont","technicalSummary":"Strong Buy","technicalSummaryClass":"buy","maBuy":12,"maSell":0,"tiBuy":5,"tiSell":2,"updateTime":null,"link":"\/currencies\/eur-chf"}}
但是 nlohmann 可以像这样与 JSON 一起工作:
{
"1": {
"row": {
"last": "1.1857",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "1.1857",
"summaryName": "EUR\/USD",
"summaryNameAlt": "EUR\/USD - Euro US Dollar",
"summaryChange": "+0.0056",
"summaryChangePercent": "+0.48",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 2,
"maSell": 10,
"tiBuy": 0,
"tiSell": 7,
"updateTime": null,
"link": "\/currencies\/eur-usd"
},
"2": {
"row": {
"last": "1.3109",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "1.3109",
"summaryName": "GBP\/USD",
"summaryNameAlt": "GBP\/USD - British Pound US Dollar",
"summaryChange": "+0.0049",
"summaryChangePercent": "+0.37",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 0,
"maSell": 12,
"tiBuy": 0,
"tiSell": 7,
"updateTime": null,
"link": "\/currencies\/gbp-usd"
},
"3": {
"row": {
"last": "105.64",
"ma": "Strong Buy",
"ma_class": "greenFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "downArrow",
"summaryLast": "105.64",
"summaryName": "USD\/JPY",
"summaryNameAlt": "USD\/JPY - US Dollar Japanese Yen",
"summaryChange": "-0.07",
"summaryChangePercent": "-0.06",
"summaryChangeClass": "redFont",
"technicalSummary": "Strong Buy",
"technicalSummaryClass": "buy",
"maBuy": 12,
"maSell": 0,
"tiBuy": 9,
"tiSell": 0,
"updateTime": null,
"link": "\/currencies\/usd-jpy"
},
"5": {
"row": {
"last": "0.7189",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "0.7189",
"summaryName": "AUD\/USD",
"summaryNameAlt": "AUD\/USD - Australian Dollar US Dollar",
"summaryChange": "+0.0029",
"summaryChangePercent": "+0.40",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 0,
"maSell": 12,
"tiBuy": 0,
"tiSell": 8,
"updateTime": null,
"link": "\/currencies\/aud-usd"
},
"7": {
"row": {
"last": "1.3278",
"ma": "Buy",
"ma_class": "greenFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "downArrow",
"summaryLast": "1.3278",
"summaryName": "USD\/CAD",
"summaryNameAlt": "USD\/CAD - US Dollar Canadian Dollar",
"summaryChange": "-0.0039",
"summaryChangePercent": "-0.29",
"summaryChangeClass": "redFont",
"technicalSummary": "Buy",
"technicalSummaryClass": "buy",
"maBuy": 11,
"maSell": 1,
"tiBuy": 3,
"tiSell": 3,
"updateTime": null,
"link": "\/currencies\/usd-cad"
},
"9": {
"row": {
"last": "125.25",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "125.25",
"summaryName": "EUR\/JPY",
"summaryNameAlt": "EUR\/JPY - Euro Japanese Yen",
"summaryChange": "+0.51",
"summaryChangePercent": "+0.40",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 2,
"maSell": 10,
"tiBuy": 0,
"tiSell": 9,
"updateTime": null,
"link": "\/currencies\/eur-jpy"
},
"10": {
"row": {
"last": "1.0777",
"ma": "Strong Buy",
"ma_class": "greenFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "1.0777",
"summaryName": "EUR\/CHF",
"summaryNameAlt": "EUR\/CHF - Euro Swiss Franc",
"summaryChange": "+0.0003",
"summaryChangePercent": "+0.03",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Buy",
"technicalSummaryClass": "buy",
"maBuy": 12,
"maSell": 0,
"tiBuy": 5,
"tiSell": 2,
"updateTime": null,
"link": "\/currencies\/eur-chf"
}
}
有没有办法在 C++ 代码中将 JSON 从第一种格式格式化为第二种格式 ?不使用网站。也许有一个库,或者只用 C++ 或 STL 就可以实现。
问题与 nlohmann 代码无关。它工作正常。
问题是我下载了 JSON 并尝试在一个程序中解析它。问题是我用这段代码创建文件:
FILE* file = fopen(path, "w");
之后我不会关闭它。 问题是我试图解析未关闭的文件。
我补充了:
fclose(file);
在 尝试解析之前。一切都成功了!
我尝试使用相同的代码来解析我之前下载的文件,它可以正常工作。
我正在尝试使用 nlohmann/json 库在 C++ 中解析 JSON。但是这个库无法解析未格式化的 JSON.
我收到一个错误:
libc++abi.dylib: terminating with uncaught exception of type nlohmann::detail::parse_error: [json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - unexpected end of input; expected '[', '{', or a literal
这个JSON给我一个错误:
{"1":{"row":{"last":"1.1857","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"1.1857","summaryName":"EUR\/USD","summaryNameAlt":"EUR\/USD - Euro US Dollar","summaryChange":"+0.0056","summaryChangePercent":"+0.48","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":2,"maSell":10,"tiBuy":0,"tiSell":7,"updateTime":null,"link":"\/currencies\/eur-usd"},"2":{"row":{"last":"1.3109","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"1.3109","summaryName":"GBP\/USD","summaryNameAlt":"GBP\/USD - British Pound US Dollar","summaryChange":"+0.0049","summaryChangePercent":"+0.37","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":0,"maSell":12,"tiBuy":0,"tiSell":7,"updateTime":null,"link":"\/currencies\/gbp-usd"},"3":{"row":{"last":"105.64","ma":"Strong Buy","ma_class":"greenFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"downArrow","summaryLast":"105.64","summaryName":"USD\/JPY","summaryNameAlt":"USD\/JPY - US Dollar Japanese Yen","summaryChange":"-0.07","summaryChangePercent":"-0.06","summaryChangeClass":"redFont","technicalSummary":"Strong Buy","technicalSummaryClass":"buy","maBuy":12,"maSell":0,"tiBuy":9,"tiSell":0,"updateTime":null,"link":"\/currencies\/usd-jpy"},"5":{"row":{"last":"0.7189","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"0.7189","summaryName":"AUD\/USD","summaryNameAlt":"AUD\/USD - Australian Dollar US Dollar","summaryChange":"+0.0029","summaryChangePercent":"+0.40","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":0,"maSell":12,"tiBuy":0,"tiSell":8,"updateTime":null,"link":"\/currencies\/aud-usd"},"7":{"row":{"last":"1.3278","ma":"Buy","ma_class":"greenFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"downArrow","summaryLast":"1.3278","summaryName":"USD\/CAD","summaryNameAlt":"USD\/CAD - US Dollar Canadian Dollar","summaryChange":"-0.0039","summaryChangePercent":"-0.29","summaryChangeClass":"redFont","technicalSummary":"Buy","technicalSummaryClass":"buy","maBuy":11,"maSell":1,"tiBuy":3,"tiSell":3,"updateTime":null,"link":"\/currencies\/usd-cad"},"9":{"row":{"last":"125.25","ma":"Strong Sell","ma_class":"redFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"125.25","summaryName":"EUR\/JPY","summaryNameAlt":"EUR\/JPY - Euro Japanese Yen","summaryChange":"+0.51","summaryChangePercent":"+0.40","summaryChangeClass":"greenFont","technicalSummary":"Strong Sell","technicalSummaryClass":"sell","maBuy":2,"maSell":10,"tiBuy":0,"tiSell":9,"updateTime":null,"link":"\/currencies\/eur-jpy"},"10":{"row":{"last":"1.0777","ma":"Strong Buy","ma_class":"greenFont","clock":"<span class=\"greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"1.0777","summaryName":"EUR\/CHF","summaryNameAlt":"EUR\/CHF - Euro Swiss Franc","summaryChange":"+0.0003","summaryChangePercent":"+0.03","summaryChangeClass":"greenFont","technicalSummary":"Strong Buy","technicalSummaryClass":"buy","maBuy":12,"maSell":0,"tiBuy":5,"tiSell":2,"updateTime":null,"link":"\/currencies\/eur-chf"}}
但是 nlohmann 可以像这样与 JSON 一起工作:
{
"1": {
"row": {
"last": "1.1857",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "1.1857",
"summaryName": "EUR\/USD",
"summaryNameAlt": "EUR\/USD - Euro US Dollar",
"summaryChange": "+0.0056",
"summaryChangePercent": "+0.48",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 2,
"maSell": 10,
"tiBuy": 0,
"tiSell": 7,
"updateTime": null,
"link": "\/currencies\/eur-usd"
},
"2": {
"row": {
"last": "1.3109",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "1.3109",
"summaryName": "GBP\/USD",
"summaryNameAlt": "GBP\/USD - British Pound US Dollar",
"summaryChange": "+0.0049",
"summaryChangePercent": "+0.37",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 0,
"maSell": 12,
"tiBuy": 0,
"tiSell": 7,
"updateTime": null,
"link": "\/currencies\/gbp-usd"
},
"3": {
"row": {
"last": "105.64",
"ma": "Strong Buy",
"ma_class": "greenFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "downArrow",
"summaryLast": "105.64",
"summaryName": "USD\/JPY",
"summaryNameAlt": "USD\/JPY - US Dollar Japanese Yen",
"summaryChange": "-0.07",
"summaryChangePercent": "-0.06",
"summaryChangeClass": "redFont",
"technicalSummary": "Strong Buy",
"technicalSummaryClass": "buy",
"maBuy": 12,
"maSell": 0,
"tiBuy": 9,
"tiSell": 0,
"updateTime": null,
"link": "\/currencies\/usd-jpy"
},
"5": {
"row": {
"last": "0.7189",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "0.7189",
"summaryName": "AUD\/USD",
"summaryNameAlt": "AUD\/USD - Australian Dollar US Dollar",
"summaryChange": "+0.0029",
"summaryChangePercent": "+0.40",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 0,
"maSell": 12,
"tiBuy": 0,
"tiSell": 8,
"updateTime": null,
"link": "\/currencies\/aud-usd"
},
"7": {
"row": {
"last": "1.3278",
"ma": "Buy",
"ma_class": "greenFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "downArrow",
"summaryLast": "1.3278",
"summaryName": "USD\/CAD",
"summaryNameAlt": "USD\/CAD - US Dollar Canadian Dollar",
"summaryChange": "-0.0039",
"summaryChangePercent": "-0.29",
"summaryChangeClass": "redFont",
"technicalSummary": "Buy",
"technicalSummaryClass": "buy",
"maBuy": 11,
"maSell": 1,
"tiBuy": 3,
"tiSell": 3,
"updateTime": null,
"link": "\/currencies\/usd-cad"
},
"9": {
"row": {
"last": "125.25",
"ma": "Strong Sell",
"ma_class": "redFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "125.25",
"summaryName": "EUR\/JPY",
"summaryNameAlt": "EUR\/JPY - Euro Japanese Yen",
"summaryChange": "+0.51",
"summaryChangePercent": "+0.40",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Sell",
"technicalSummaryClass": "sell",
"maBuy": 2,
"maSell": 10,
"tiBuy": 0,
"tiSell": 9,
"updateTime": null,
"link": "\/currencies\/eur-jpy"
},
"10": {
"row": {
"last": "1.0777",
"ma": "Strong Buy",
"ma_class": "greenFont",
"clock": "<span class=\"greenClockIcon\"> <\/span>"
},
"arrowBoxClass": "upArrow",
"summaryLast": "1.0777",
"summaryName": "EUR\/CHF",
"summaryNameAlt": "EUR\/CHF - Euro Swiss Franc",
"summaryChange": "+0.0003",
"summaryChangePercent": "+0.03",
"summaryChangeClass": "greenFont",
"technicalSummary": "Strong Buy",
"technicalSummaryClass": "buy",
"maBuy": 12,
"maSell": 0,
"tiBuy": 5,
"tiSell": 2,
"updateTime": null,
"link": "\/currencies\/eur-chf"
}
}
有没有办法在 C++ 代码中将 JSON 从第一种格式格式化为第二种格式 ?不使用网站。也许有一个库,或者只用 C++ 或 STL 就可以实现。
问题与 nlohmann 代码无关。它工作正常。
问题是我下载了 JSON 并尝试在一个程序中解析它。问题是我用这段代码创建文件:
FILE* file = fopen(path, "w");
之后我不会关闭它。 问题是我试图解析未关闭的文件。
我补充了:
fclose(file);
在 尝试解析之前。一切都成功了!
我尝试使用相同的代码来解析我之前下载的文件,它可以正常工作。