dropbox / json11

A tiny JSON library for C++11.
MIT License
2.54k stars 613 forks source link

How to parse mutlidimension array using json11 ? #106

Closed Shravan40 closed 7 years ago

Shravan40 commented 7 years ago

Here is the sample response of one of my apis. And I would like to parse it using json11.

{
  "status": 1,
  "message": {
    "fundNames": [
      "SBI Premier Liquid Fund - Institutional - Growth",
      "SBI Premier Liquid Fund - Institutional - Growth"
    ],
    "fundNavs": [
      [
        {
          "date": "2017-02-22",
          "nav": 2552.4454
        },
        {
          "date": "2017-02-21",
          "nav": 2551.9707
        }
      ],
      [
        {
          "date": "2017-02-22",
          "nav": 2552.4454
        },
        {
          "date": "2017-02-21",
          "nav": 2551.9707
        },
        {
          "date": "2017-02-18",
          "nav": 2550.6512
        }
      ]
    ]
  }
}

Here is my try

        string inputError;
        auto y = Json::parse(r.text, inputError);
        auto status = y["status"].int_value();
        if (status == 1) {
            for (auto &k: y["message"].array_items()) {
                map<string, double> data;
                for (auto &m : k[fundNavs].array_items()) {
                    auto nav = m["nav"].number_value();
                    auto nDate = m["date"].string_value();
                    data[nDate] = nav;
                }
            }
        }
artwyman commented 7 years ago

Do you have a question? It's not really easy for me to debug your code for you, but some things which jump out at me at a glance are that y["message"] is an object not an array, and that m is an array not an object.

Note that json11 is explicitly designed to give you default answers if you ask for an item which doesn't exist, or has the wrong type, so if you call array_items() on a non-array, you'll just get no items. You may want to check things more explicitly during parsing, using functions like is_array().

Shravan40 commented 7 years ago

@artwyman : Yes, I do have a question. I am really sorry for not being clear at first.

I want to parse 2-D array


{
    "2dArray" : [ [1,2,3,4,5], [2,3,4], [6,7,89] ]
}

And I wants to parse this input. 
artwyman commented 7 years ago

Again, that's not a question. What are you hoping to parse it into? What have you tried? What is unclear to you? I'm happy to help, but I'm not going to write your code for you.

Shravan40 commented 7 years ago

I have found the solution :)

        string inputError;
        auto y = Json::parse(r.text, inputError);
        for (auto &m : y["2dArray"].array_items()) {
                for(auto &n : m.array_items()) {
                    // Now element of array can be accessed with the help of iterator n
                }
            }
artwyman commented 7 years ago

Glad you were able to make it work.