Pagini recente » Cod sursa (job #2551128) | Cod sursa (job #800082) | Cod sursa (job #2892601) | Cod sursa (job #833016) | Cod sursa (job #1338709)
#include <string>
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
class Json
{
/*
--Variables--
values - all values for each element in Json Array
*/
private:
vector<vector<string> > values;
vector<string> keys;
string *raw_json;
void readRaw(ifstream& raw); /*reads the whole file into a single string*/
bool getKeys(); /* extract keys */
bool getValues(); /* extracts values for each element*/
public:
Json();
~Json();
void populate(ifstream& raw);
void printFormatedCSV(ofstream& out);
};
Json::Json(){}
Json::~Json(){delete raw_json;}
void Json::readRaw(ifstream& raw) //read file;
{
raw.seekg (0, raw.end);
int file_length = raw.tellg();
raw.seekg (0, raw.beg);
char *buffer = new char [file_length];
raw.read(buffer,file_length);
raw_json = new string(buffer);
delete[] buffer;
}
void Json::populate(ifstream& raw)
{
readRaw(raw);
getKeys();
getValues();
}
bool Json::getKeys()
{
string *temp = new string;
size_t start=0,end=0; /* beggining and end position of the extracted string */
for(size_t i=0; i<raw_json->length(); i++)
{
switch(raw_json->at(i))
{
case '{':
case ',':
i++;
while(raw_json->at(i)==' ' || raw_json->at(i)=='\n' || raw_json->at(i)=='\r') i++;
if(raw_json->at(i)=='"')
{
i++;
start = i;
while(raw_json->at(i)!='"') i++;
end=i;
}
else
{
start=i;
while(raw_json->at(i)!=' ' && raw_json->at(i)!='\n' && raw_json->at(i)!='\r'
&& raw_json->at(i)!=':') i++;
end=i;
}
*temp=raw_json->substr(start,end-start);
keys.push_back(*temp);
start=0;end=0;
break;
case ':':
case ' ':
case '\n':
case '\r':
break;
case '}':
delete temp;
return true;
}
}
return false;
}
bool Json::getValues()
{
string *temp = new string;
size_t start=0,end=0,elem=0;
for(size_t i=0; i<raw_json->length(); i++)
{
switch(raw_json->at(i))
{
case ':':
i++;
while(raw_json->at(i)==' ' || raw_json->at(i)=='\r' || raw_json->at(i)=='\n') i++;
if(raw_json->at(i)=='"' )
{
i++;
start = i;
while(raw_json->at(i)!='"') i++;
end = i;
}
else
{
start = i;
while(raw_json->at(i)!=',' && raw_json->at(i)!='}' && raw_json->at(i)!=' ' && raw_json->at(i)!='\n'
&& raw_json->at(i)!='\r') i++;
end=i;
}
*temp = raw_json->substr(start,end-start);
values.resize(elem);
values[elem-1].push_back(*temp);
break;
case '}':
case '"':
case '[':
case ' ':
break;
case '{':
elem++;
break;
case ']':
delete temp;
return true;
}
}
return false;
}
void Json::printFormatedCSV(ofstream& out)
{
for(size_t i=0; i<keys.size(); i++)
out<<keys[i]<<',';
out<<'\n';
for(size_t i=0; i<values.size(); i++)
{
for(size_t j=0; j<values[i].size(); j++)
out<<values[i][j]<<',';
out<<'\n';
}
}
int main()
{
ifstream f("convertor.in");
ofstream g("convertor.out");
Json *data = new Json;
data->populate(f);
data->printFormatedCSV(g);
f.close();
g.close();
delete data;
return 0;
}