在 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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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\">&nbsp;<\/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);

尝试解析之前。一切都成功了!

我尝试使用相同的代码来解析我之前下载的文件,它可以正常工作。