Ejemplo n.º 1
0
int main(int argc, char *argv[0]) {
  	// Declare a string variable to store a filename
  	std::string aFile;
	string		buf;	
  	// Declare a variable to read in a JSON file
  	ifstream inFile;

  	// Check for a command line argument
  	if (argc != 2) {
    	cout << "usage: " << argv[0] << " <filename>\n";
  		} else {
    	// store the command argument as the filename
    	aFile = argv[1];
  		}

  	// Read in a .json file
  	inFile.open(aFile);

  	// Check that the file name was opened successfully
  	if (inFile.fail( )) {
    	// Print an error message
    	cout << "Error opening file.\n\n";
    	exit(1);
  		} else {
    	// The file was successfully opened
    	cout << "File opened successfully.\n\n";
  		}
    // regular expressions for matches      
	regex	openBraceRE(R"(\s*[\{\[])");
    regex   closeBraceRE(R"(\s*[\}\]])");
	regex 	arrayRE(R"(\[(.+)\])") ;
    regex   emptyRE(R"(^\s*$)");
	regex   jLineRE(R"(\x22(\w+)\x22\s*: (.*),?)");
	regex   jIntRE(R"(\s*(\d+),?)");	
    regex   jStrRE(R"(\s*\x22(\w+)\x22\s*,?)");
    regex   jBoolorNullRE(R"(\s*(\w+),?)");

    // some matches and strings for thos matches
    smatch	fileTypeMatch;
    smatch  jLineMatch;
    smatch  jValMatch;
    
    string  jsonID;
    string  jsonVal;
    bool    openBraceNotFound = true;
    // temp variables for valid types found
    int     jInt;
    string  jStr;
    bool    jBool;
    string  jNull = "null";    

    // json objects 
    JsonObject* 	jObject = new JsonObject();      
    JsonArray *     jArray = new JsonArray();

    do {
        getline(inFile, buf);
        // check for empty line 
        if(regex_search(buf, jLineMatch, emptyRE)) {
            cout << "empty line...\n";
            continue;
            }
        // check for open brace
        if(regex_search(buf, jLineMatch, openBraceRE)) {    
            openBraceNotFound = false;  
            continue;            
            }
        // if the first character is not a brace display error and exit
        if (openBraceNotFound) {
            cout <<"ERROR expected {...\n";
            exit(1);
            }
        // check for close brace    
        if(regex_search(buf, jLineMatch, closeBraceRE)) {
            break; 
            }
        // if valid line found, save id and value
        if(regex_search(buf, jLineMatch, jLineRE))
            {
            jsonID = jLineMatch.str(1);
            jsonVal = jLineMatch.str(2);
            }
        // if valid line not found, put an error and exit
        else {
            cout << "\nERROR: Not a valid line! \n";
            exit(1);           
            }
        // if valid array found add too the object
        if (regex_search(jsonVal, jValMatch, arrayRE)) {
            cout << "Array matched!\n";
            jArray->Add(new JsonString(jLineMatch.str(1)));
            jObject->Add(jsonID, jArray);
            }
        // if valid integer found add it too the object    
        else if (regex_search(jsonVal, jValMatch, jIntRE)) {
            jInt = stoi(jsonVal);

            cout << "Valid Int " << jInt << " matched! \n";
            jObject->Add(jsonID, new JsonNumber(jInt));
            }    
        // if valid string found, add it to the object
        else if (regex_search(jsonVal, jValMatch, jStrRE)) {
            jStr = jValMatch.str(1);
            cout << "Valid String " << jStr << " matched! \n";
            jObject->Add(jsonID, new JsonString(jStr));
            }
        // finally look for bool or null
        else if(regex_search(jsonVal, jValMatch, jBoolorNullRE)) {           
            if ("true" == jValMatch.str(1)) {
                jBool = true ;         
                cout << "Valid bool " <<  jBool << " matched! \n";
                jObject->Add(jsonID, new JsonBoolean(jBool));
               
                }
            else if ("false" == jValMatch.str(1)){
                jBool = false ;
                cout << "Valid bool " <<  jBool << " matched! \n";
                jObject->Add(jsonID, new JsonBoolean(jBool));
                }            
           
            else if ("null" == jValMatch.str(1)){
                cout << "Valid null matched! \n";
                jObject->Add(jsonID, new JsonNull());
                }            
            }
        // if the line from file contains anything else then exit         
        else {
            cout << "Error invalid value...\n";
            exit(1);
            }

        } while (!inFile.eof());


	cout << endl;
    jObject->Print();
    cout << endl;	
    return 0;
}
Ejemplo n.º 2
0
void UsersPanel::BuildIndexForUser(JsonArray * friends) {
	/*
	String letter, prevLetter = L"";
	int currentGroup = 0;

	JsonArray * array = new JsonArray();
	array->Construct();

	for (int i=0; i<friends->GetCount(); i++) {
		JsonObject *user;
		JsonParseUtils::GetObject(friends, i, user);

		String name;
		JsonParseUtils::GetString(*user, L"first_name", name);

		name.SubString(0, 1, letter);

		if (letter != prevLetter) {
			_fastScrollIndex.Append(letter);
			_pCurrentModel->AddUserGroup(prevLetter, array);

			if (prevLetter.GetLength() > 0) {
				AppLog("Adding %ls to %d item", prevLetter.GetPointer(), currentGroup);
				_pLetterNav->Add(new String(prevLetter), new Integer(currentGroup));
				currentGroup++;
			}

			prevLetter = letter;
			delete array;
			array = new JsonArray();
			array->Construct();
		} else {
			array->Add(user);
		}

	}*/

	HashMap *letterMap = new HashMap();
	letterMap->Construct();

	for(int i = 0; i < friends->GetCount(); i++) {
		JsonObject *user;
		JsonParseUtils::GetObject(friends, i, user);

		String name;
		JsonParseUtils::GetString(*user, L"first_name", name);

		String letter;
		name.SubString(0, 1, letter);

		JsonArray *letterArray;
		if(!letterMap->ContainsKey(letter)) {
			letterArray = new JsonArray();
			letterArray->Construct();
			letterMap->Add(new String(letter), letterArray);
		} else {
			letterArray = static_cast<JsonArray*>(letterMap->GetValue(letter));
		}

		letterArray->Add(user);
	}

	IList *letterList = letterMap->GetKeysN();
	StringComparer comparer;
	letterList->Sort(comparer);
	for(int i = 0; i < letterList->GetCount(); i++) {
		String *letter = static_cast<String *>(letterList->GetAt(i));
		_fastScrollIndex.Append(*letter);
		_pCurrentModel->AddUserGroup(*letter, static_cast<JsonArray *>(letterMap->GetValue(*letter)));
		_pLetterNav->Add(new String(*letter), new Integer(i));
	}

	delete letterList;
	delete letterMap;
}