Basic Implementation of JSON. Capable of create a JSON string and parse a JSON string. Uses the "lazy" JSON implementation. Incapable of modify and delete variables from the objects. Contains 2 objects: JSONArray and JSONObject. Inspired in Java-Android implementation of JSON. Version 0.5.

Dependents:   mbed_networking

oJSON.cpp

Committer:
PhoenixUnicamp
Date:
2012-11-24
Revision:
1:ac1512fd0d1e
Parent:
0:7aaa16136d09

File content as of revision 1:ac1512fd0d1e:

/* Copyright (c) 2012 Otavio Netto Zani, MIT License
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
 * and associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or 
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */



#include "oJSON.h"

//FUNCOES GENERICAS

int numberOfChars(char counter, string entrada){
    int n=0;
    string::iterator it;
    bool ignore=false;
    for(it=entrada.begin(); it<entrada.end();it++){
        if(*it == '{' || *it == '[')
            ignore = true;
        else if(*it == '}' || *it == ']')
            ignore = false;
        if(*it == counter && !ignore)
            n++;
    }
    return n;

}

string clear(string toDelete){
    string aux;
    string::iterator it;
    it=toDelete.begin();

    if(*it=='{' || *it=='['){
        aux=toDelete.substr(1,toDelete.size()-2);
        return aux;
    }
    return toDelete;


}


string* explode(char separator, string entrada){
    int n = numberOfChars(separator,clear(entrada));
    int aux=0, aux2=0;
    int i=0;
    string *retorno;
    string::iterator it;
    bool ignore = false;

    retorno = new string[n+1];

    if(n==0){
        retorno[0]=entrada;
        return retorno;
    }

    for(it = entrada.begin();it<entrada.end();it++){
        if(*it=='{' || *it=='[')
            ignore=true;
        else if(*it=='}' || *it==']')
            ignore=false;

        if(*it==separator && !ignore){
            if(aux2-aux>0)
                retorno[i] = entrada.substr(aux,aux2-aux);
            else
                retorno[i] = "";
            aux=aux2+1;
            i++;
        }

        if(it==entrada.end()-1)
            retorno[i]=entrada.substr(aux,aux2-aux+1);

        aux2++;
    }

    return retorno;

}

//FUNCOES DO OBJETO

JSONObject::JSONObject(char* interpreter){
    string convertida(interpreter);

    if(convertida.compare("{}")==0){
        nValues = 0;
        values=NULL;
        labels=NULL;
        return;
    }

    if(convertida.compare("null")==0)
        return;


    JSONObject::criar(convertida);
}


JSONObject::JSONObject(string entrada){
     if(entrada.compare("{}")==0){
        nValues = 0;
        values=NULL;
        labels=NULL;
        return;
    }

    if(entrada.compare("null")==0)
        return;

    criar(entrada);
}

JSONObject::JSONObject(){
    nValues=0;
    values=NULL;
    labels=NULL;

}


void JSONObject::criar(string entrada){
    string copyEntrada;
    string *aux, *aux2;

    copyEntrada = clear(entrada);
    nValues = numberOfChars(',',copyEntrada)+1;


    labels = new string[nValues];
    values = new string[nValues];
    

    aux2 = explode(',',copyEntrada);

    for(int i=0; i<nValues;i++){

        aux = explode(':', aux2[i]);

        labels[i]=aux[0];
        values[i]=aux[1];
    }

    return;
}


string JSONObject::getString(char* label){
    string label2(label);
    return getString(label2);
}

string JSONObject::getString(string label){

    for(int i=0; i<nValues; i++){
        if(label.compare(labels[i])==0){
            return values[i].substr(1,values[i].size()-2);

        }
    }
    return NULL;
}

JSONArray JSONObject::getArray(char* label){
    string label2(label);
    return getArray(label2);

}

JSONArray JSONObject::getArray(string label){

    for(int i=0; i<nValues; i++){
        if(label.compare(labels[i])==0){
            return (JSONArray) values[i];

        }
    }
    return NULL;
}

JSONObject JSONObject::getObject(char* label){
    string label2(label);
    return getObject(label2);

}

JSONObject JSONObject::getObject(string label){

    for(int i=0; i<nValues; i++){
        if(label.compare(labels[i])==0){
            return (JSONObject) values[i];

        }
    }
    return NULL;
}

float JSONObject::getFloat(char* label){
    string label2 (label);
    return getFloat(label2);
}

float JSONObject::getFloat(string label){
    float aux;
    char *aux2;

    for(int i=0; i<nValues; i++){
        if(label.compare(labels[i])==0){
            aux2=&values[i][0];
            sscanf(aux2,"%f",&aux);
            return aux;

        }
    }
    return NULL;


}

int JSONObject::getInt(char* label){
    string label2 (label);
    return getInt(label2);
}

int JSONObject::getInt(string label){
    int aux;
    char *aux2;

    for(int i=0; i<nValues; i++){
        if(label.compare(labels[i])==0){
            aux2=&values[i][0];
            sscanf(aux2,"%d",&aux);
            return aux;

        }
    }
    return NULL;


}

bool JSONObject::getBoolean(char *label){
    string label2(label);
    return getBoolean(label2);
}

bool JSONObject::getBoolean(string label){

     for(int i=0; i<nValues; i++){
        if(label.compare(labels[i])==0){
            if(values[i].compare("true")==0)
                return true;
            else if(values[i].compare("false")==0)
                return false;

        }
    }
    return NULL;

}

bool JSONObject::isNull(char *label){
    string label2(label);
    return isNull(label2);

}

bool JSONObject::isNull(string label){

    for(int i=0; i<nValues; i++){
        if(label.compare(labels[i])==0){
            if(values[i].compare("null")==0)
                return true;
            else
                return false;

        }
    }
    return NULL;



}

string JSONObject::toString(){
    string aux("{");

    for(int i=0; i<nValues; i++){
        aux+=labels[i]+":"+values[i];
        if(i==nValues-1)
            aux+="}";
        else
            aux+=",";

    }
    return aux;

}


void JSONObject::add(string label, JSONArray array){
    add(label,array.toString());
    return;
}

void JSONObject::add(string label, JSONObject object){
    add(label, object.toString());
    return;
}

void JSONObject::add(string label, bool boolean){
    string aux("");
    if(boolean){
        aux+="true";
        add(label, aux);
        return;
    }
    aux+="false";
    return;
}

void JSONObject::add(string label, int value){
    stringstream aux;
    aux<<value;
    add(label,aux.str());
    return;
}

void JSONObject::add(string label, float value){
    stringstream aux;
    aux<<value;
    add(label,aux.str());
    return;

}

void JSONObject::add(string label, string value){
    string *auxL, *auxV;
    auxL = new string[nValues+1];
    auxV = new string[nValues+1];
    for(int i=0; i<nValues;i++){
        auxL[i]=labels[i];
        auxV[i]=values[i];
    }
    nValues++;
    auxL[nValues-1]=label;
    auxV[nValues-1]=value;

    delete[] labels;
    delete[] values;

    labels=auxL;
    values=auxV;

    return;


}

// FUNCOES DA ARRAY

JSONArray::JSONArray(char *entrada){
    string convertida(entrada);
     if(convertida.compare("[]")==0){
        nValues = 0;
        values=NULL;
        return;
    }

    if(convertida.compare("null")==0)
        return;

    JSONArray::criar(convertida);
}

JSONArray::JSONArray(string entrada){

     if(entrada.compare("[]")==0){
        nValues = 0;
        values=NULL;
        return;
    }

    if(entrada.compare("null")==0)
        return;

    JSONArray::criar(entrada);
}

JSONArray::JSONArray(){
    nValues=0;
    values=NULL;
}

void JSONArray::criar(string entrada){
    string copyEntrada = clear(entrada);
    nValues = numberOfChars(',',copyEntrada)+1;

    values = explode(',',copyEntrada);


}


string JSONArray::getString(int index){
    return values[index].substr(1,values[index].size()-2);

}

JSONArray JSONArray::getArray(int index){
    return (JSONArray) values[index];
}

JSONObject JSONArray::getObject(int index){
    return (JSONObject) values[index];
}

int JSONArray::getInt(int index){
    int aux;
    char *aux2;

    aux2 = &values[index][0];

    sscanf(aux2, "%i",&aux);

    return aux;

}

float JSONArray::getFloat(int index){

    float aux;
    char *aux2;

    aux2 = &values[index][0];

    sscanf(aux2, "%f",&aux);

    return aux;

}

bool JSONArray::getBoolean(int index){
    if(values[index].compare("true")==0)
        return true;
    else if(values[index].compare("false")==0)
        return false;
    return NULL;
}

bool JSONArray::isNull(int index){
    if(values[index].compare("null")==0)
        return true;
    else
        return false;
        
}

string JSONArray::toString(){
    string aux("[");
    for(int i=0; i<nValues;i++){
        aux+=values[i];
        if(i==nValues-1)
            aux+="]";
        else
            aux+=",";

    }
    return aux;

}

void JSONArray::add(JSONArray array){
    add(array.toString());
    return;
}

void JSONArray::add(JSONObject object){
    add(object.toString());
    return;

}

void JSONArray::add(bool boolean){
    string aux("");
    if(boolean){
        aux+="true";
        add(aux);
        return;
    }
    aux+="false";
    add(aux);
    return;

}

void JSONArray::add(int value){
    stringstream aux;
    aux<<value;
    add(aux.str());
    return;
}

void JSONArray::add(float value){
    stringstream aux;
    aux<<value;
    add(aux.str());
    return;
}

void JSONArray::add(string value){

    string *auxV;
    auxV = new string[nValues+1];
    for(int i=0; i<nValues;i++){
        auxV[i]=values[i];
    }
    nValues++;
    auxV[nValues-1]=value;

    delete[] values;

    values=auxV;
    return;

}