Search code examples
c++jsonnlohmann-json

Format JSON in C++


I'm trying to parse JSON in C++ with nlohmann/json library. But this library can't parse not formatted JSON.

I get an error:

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

This JSON gives me an error:

{"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"}}

But nlohmann works fine with JSON like this:

{
  "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"
  }
}

Is there a way to format JSON from first format to the second one in C++ code? Without using websites. Maybe there's a library for this, or it's achievable with just C++ or STL.


Solution

  • The problem isn't connected with nlohmann code. It works fine.

    The problem is that I download that JSON and try to parse it in one program. The problem was that I create file with this code:

    FILE* file = fopen(path, "w");
    

    And I don't close it after. The problem was I tried to parse not closed file.

    I added:

    fclose(file);
    

    Before trying to parse. And it all worked!

    I tried the same code to parse file which I downloaded some time ago, and it worked as it should.