Home > OS >  Iterate an array from json using jsoncpp
Iterate an array from json using jsoncpp

Time:05-25

I have the following json:

{
    "laureates": [{
        "id": "1",
        "firstname": "Wilhelm Conrad",
        "surname": "Röntgen",
        "born": "1845-03-27",
        "died": "1923-02-10",
        "bornCountry": "Prussia (now Germany)",
        "bornCountryCode": "DE",
        "bornCity": "Lennep (now Remscheid)",
        "diedCountry": "Germany",
        "diedCountryCode": "DE",
        "diedCity": "Munich",
        "gender": "male",
        "prizes": [{
            "year": "1901",
            "category": "physics",
            "share": "1",
            "motivation": "\"in recognition of the extraordinary services he has rendered by the discovery of the remarkable rays subsequently named after him\""
        }]
    }]
}

I have tried this:

bool ok = reader.parse(txt, root, false);

    if(! ok)
    {
        std::cout << "failed parse\n";
    }

std::vector<std::string> keys = root.getMemberNames();

for (std::vector<std::string>::const_iterator it = keys.begin(); it != keys.end();   it)
    {
        if (root[*it].isString())
        {
            std::string value = root[*it].asString();
            std::cout << value << std::endl;
        }
        else if (root[*it].isInt())
        {
             int value = root[*it].asInt();
             std::cout << value << std::endl;
        }
        else if (root[*it].isArray()){
            // what to do here?
        }
}

The code works fine, but the problem is when I have an array like "prizes". I can't realize how to iterate and show the values without hardcoded it.

Can anyone help me with this?

Thanks in advance.

CodePudding user response:

I can't realize how to iterate and show the values without hardcoded it.

I think the problem is that you don't have a great handle on recursion or the key->value nature of JSON, because when you have an array like "prizes", you could have a nested Json object, such as an array inside an array.

You could use a recursion to handle that:

#include <jsoncpp/json/json.h>

#include <iostream>

void PrintJSONValue(const Json::Value &val) {
  if (val.isString()) {
    std::cout << val.asString();
  } else if (val.isBool()) {
    std::cout << val.asBool();
  } else if (val.isInt()) {
    std::cout << val.asInt();
  } else if (val.isUInt()) {
    std::cout << val.asUInt();
  } else if (val.isDouble()) {
    std::cout << val.asDouble();
  } else {
  }
}

void HandleJsonTree(const Json::Value &root, uint32_t depth = 0) {
  depth  = 1;
  if (root.size() > 0) {
    std::cout << '\n';
    for (Json::Value::const_iterator itr = root.begin(); itr != root.end();
         itr  ) {
      // print space to indicate depth
      for (int tab = 0; tab < depth; tab  ) {
        std::cout << " ";
      }
      std::cout << "key: ";
      PrintJSONValue(itr.key());
      std::cout << " ";
      HandleJsonTree(*itr, depth);
    }
  } else {
    std::cout << ", value: ";
    PrintJSONValue(root);
    std::cout << "\n";
  }
}

int main(int argc, char **argv) {
  std::string json = R"###(
        {
    "laureates": [
        {
            "id": "1",
            "firstname": "Wilhelm Conrad",
            "surname": "Röntgen",
            "born": "1845-03-27",
            "died": "1923-02-10",
            "bornCountry": "Prussia (now Germany)",
            "bornCountryCode": "DE",
            "bornCity": "Lennep (now Remscheid)",
            "diedCountry": "Germany",
            "diedCountryCode": "DE",
            "diedCity": "Munich",
            "gender": "male",
            "prizes": [
                {
                    "year": "1901",
                    "category": "physics",
                    "share": "1",
                    "motivation": "in recognition of the extraordinary services he has rendered by the discovery of the remarkable rays subsequently named after him"
                }
            ]
        }
    ]
}
    )###";
  Json::Value root;
  Json::Reader reader;
  bool ok = reader.parse(json, root, false);

  if (!ok) {
    std::cout << "failed parse\n";
  }

  HandleJsonTree(root);
}

The output looks like this:

 key: laureates 
  key: 0 -- the first item of an array
   key: born , value: 1845-03-27
   key: bornCity , value: Lennep (now Remscheid)
   key: bornCountry , value: Prussia (now Germany)
   key: bornCountryCode , value: DE
   key: died , value: 1923-02-10
   key: diedCity , value: Munich
   key: diedCountry , value: Germany
   key: diedCountryCode , value: DE
   key: firstname , value: Wilhelm Conrad
   key: gender , value: male
   key: id , value: 1
   key: prizes 
    key: 0 -- the first item of an array
     key: category , value: physics
     key: motivation , value: in recognition of the extraordinary services he has rendered by the discovery of the remarkable rays subsequently named after him
     key: share , value: 1
     key: year , value: 1901
   key: surname , value: Röntgen
  • Related