Search code examples
c++arraysjsonsortinggoogle-nativeclient

In C++ using NaCl how to sort a JSON object by value?


I'm using PicoJSON to handle JSON that I get from JavaScript into C++.

If I have a JSON with keys and values of the form {"val1":3, "val2":4} I can get the value of every specific key like so:

picojson::value v;

const string json2("{\"val1\":3,\"val2\":4}");

int val1 = (int)v.get("val1").get<double>(); // val1 will be equal to 3
int val2 = (int)v.get("val2").get<double>(); // val2 will be equal to 4

The problem is that I have an array of objects coming from JavaScript in the form of JSON that look like [{"name": 3},{"name": 1},{"name": 2}]. So now the code will look like this:

picojson::value v;
const string json1("[{\"name\": 3},{\"name\": 1},{\"name\": 2}]");

I am expected to sort them so the expected output should be:

"[{\"name\": 1},{\"name\": 2},{\"name\": 3}]"
  • Do I have to use a 'for loop' with a linked list to somehow extract that data to sort it? If so, how?
  • Maybe this can be extracted using regular expressions? If so, how?
  • Should the array can be converted into array of arrays in order to sort it? If so, how?
  • Do I have to build a struct or a vector to get a sortable data structure recognisable by C++? If so, how?

Note: The number of elements varies - it can be greater/smaller.

EDIT:

Can this task be solved if the data structure is in this form (just like I had with {"val1":3, "val2":4} ) :

{"name3": 3, "name1" : 1, "name2": 2, "name97" : 97, ... }

I am flexible to changing it so that C++ would be able to handle it.

Would it then be possible to traverse every key and sort in by value ? If yes, how to do it?


Solution

  • You can put your data into a vector and sort it.

    array arr = v.get<array>();
    vector<int> vi;
    for (array::const_iterator it = arr.begin(); it != arr.end(); ++it) {
      vi.push_back((int)(*it).get("name").get<double>());
    }
    sort(vi.begin(), vi.end());
    
    stringstream ss;
    vector<int>::const_iterator it;
    for (ss<<"[", it = vi.begin(); (it+1) != vi.end(); ++it) {
      ss<<"{\"name\": "<<(*it)<<"},";
    }
    ss<<"{\"name\": "<<(*it)<<"}]";
    
    cout<<"Output: "<<ss.str()<<endl;
    

    Here is outputs:

    Input:  [{"name": 3},{"name": 1},{"name": 2}]
    Output: [{"name": 1},{"name": 2},{"name": 3}]