aJson is the attempt to port a complete JSON implementation to Arduino. It is based on the cJSON implementation, reduced in size and removing one or two feature. The current mbed implementation only supports FILE* as input so you will have to use a temporary file for parsing your json input. https://github.com/interactive-matter/aJson
Diff: aJSON.h
- Revision:
- 1:6df1d1f1b372
- Parent:
- 0:428cf9a51873
diff -r 428cf9a51873 -r 6df1d1f1b372 aJSON.h --- a/aJSON.h Mon Aug 27 15:15:45 2012 +0000 +++ b/aJSON.h Tue Aug 28 08:16:29 2012 +0000 @@ -1,167 +1,167 @@ -/* - Copyright (c) 2001, Interactive Matter, Marcus Nowotny - - Based on the cJSON Library, Copyright (C) 2009 Dave Gamble - - 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. - */ - -#ifndef aJson__h -#define aJson__h - -/****************************************************************************** - * Includes - ******************************************************************************/ -#include <stdio.h> - - -/****************************************************************************** - * Definitions - ******************************************************************************/ -// aJson Types: -#define aJson_False 0 -#define aJson_True 1 -#define aJson_NULL 2 -#define aJson_Int 3 -#define aJson_Float 4 -#define aJson_String 5 -#define aJson_Array 6 -#define aJson_Object 7 - -#define aJson_IsReference 128 - -// The aJson structure: -typedef struct aJsonObject { - char *name; // The item's name string, if this item is the child of, or is in the list of subitems of an object. - struct aJsonObject *next, *prev; // next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem - struct aJsonObject *child; // An array or object item will have a child pointer pointing to a chain of the items in the array/object. - - char type; // The type of the item, as above. - - union { - char *valuestring; // The item's string, if type==aJson_String - char valuebool; //the items value for true & false - int valueint; // The item's number, if type==aJson_Number - double valuefloat; // The item's number, if type==aJson_Number - }; -} aJsonObject; - -class aJsonClass { - /****************************************************************************** - * Constructors - ******************************************************************************/ - - /****************************************************************************** - * User API - ******************************************************************************/ -public: - // Supply a block of JSON, and this returns a aJson object you can interrogate. Call aJson.deleteItem when finished. - aJsonObject* parse(FILE* stream); //Reads from a stream - aJsonObject* parse(FILE* stream,char** filter_values); //Read from a file, but only return values include in the char* array filter_values - aJsonObject* parse(char *value); //Reads from a string - // Render a aJsonObject entity to text for transfer/storage. Free the char* when finished. - int print(aJsonObject *item, FILE* stream); - char* print(aJsonObject* item); - //Renders a aJsonObject directly to a output stream - char stream(aJsonObject *item, FILE* stream); - // Delete a aJsonObject entity and all sub-entities. - void deleteItem(aJsonObject *c); - - // Returns the number of items in an array (or object). - unsigned char getArraySize(aJsonObject *array); - // Retrieve item number "item" from array "array". Returns NULL if unsuccessful. - aJsonObject* getArrayItem(aJsonObject *array, unsigned char item); - // Get item "string" from object. Case insensitive. - aJsonObject* getObjectItem(aJsonObject *object, const char *string); - - // These calls create a aJsonObject item of the appropriate type. - aJsonObject* createNull(); - aJsonObject* createTrue(); - aJsonObject* createFalse(); - aJsonObject* createItem(char b); - aJsonObject* createItem(int num); - aJsonObject* createItem(double num); - aJsonObject* createItem(const char *string); - aJsonObject* createArray(); - aJsonObject* createObject(); - - // These utilities create an Array of count items. - aJsonObject* createIntArray(int *numbers, unsigned char count); - aJsonObject* createFloatArray(double *numbers, unsigned char count); - aJsonObject* createDoubleArray(double *numbers, unsigned char count); - aJsonObject* createStringArray(const char **strings, unsigned char count); - - // Append item to the specified array/object. - void addItemToArray(aJsonObject *array, aJsonObject *item); - void addItemToObject(aJsonObject *object, const char *string, - aJsonObject *item); - // Append reference to item to the specified array/object. Use this when you want to add an existing aJsonObject to a new aJsonObject, but don't want to corrupt your existing aJsonObject. - void addItemReferenceToArray(aJsonObject *array, aJsonObject *item); - void addItemReferenceToObject(aJsonObject *object, const char *string, - aJsonObject *item); - - // Remove/Detach items from Arrays/Objects. - aJsonObject* detachItemFromArray(aJsonObject *array, unsigned char which); - void deleteItemFromArray(aJsonObject *array, unsigned char which); - aJsonObject* detachItemFromObject(aJsonObject *object, const char *string); - void deleteItemFromObject(aJsonObject *object, const char *string); - - // Update array items. - void replaceItemInArray(aJsonObject *array, unsigned char which, - aJsonObject *newitem); - void replaceItemInObject(aJsonObject *object, const char *string, - aJsonObject *newitem); - - void addNullToObject(aJsonObject* object, const char* name); - void addTrueToObject(aJsonObject* object, const char* name); - void addFalseToObject(aJsonObject* object, const char* name); - void addNumberToObject(aJsonObject* object, const char* name, int n); - void addNumberToObject(aJsonObject* object, const char* name, double n); - void addStringToObject(aJsonObject* object, const char* name, - const char* s); - -private: - aJsonObject* newItem(); - int parseNumber(aJsonObject *item, FILE* stream); - int printInt(aJsonObject *item, FILE* stream); - int printFloat(aJsonObject *item, FILE* stream); - - int parseString(aJsonObject *item, FILE* stream); - int printStringPtr(const char *str, FILE* stream); - int printString(aJsonObject *item, FILE* stream); - - int skip(FILE* stream); - - int parseValue(aJsonObject *item, FILE* stream, char** filter); - int printValue(aJsonObject *item, FILE* stream); - - int parseArray(aJsonObject *item, FILE* stream, char** filter); - int printArray(aJsonObject *item, FILE* stream); - - int parseObject(aJsonObject *item, FILE* stream, char** filter); - int printObject(aJsonObject *item, FILE* stream); - void suffixObject(aJsonObject *prev, aJsonObject *item); - - aJsonObject* createReference(aJsonObject *item); - -}; - -extern aJsonClass aJson; - -#endif +/* + Copyright (c) 2001, Interactive Matter, Marcus Nowotny + + Based on the cJSON Library, Copyright (C) 2009 Dave Gamble + + 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. + */ + +#ifndef aJson__h +#define aJson__h + +/****************************************************************************** + * Includes + ******************************************************************************/ +#include <stdio.h> + + +/****************************************************************************** + * Definitions + ******************************************************************************/ +// aJson Types: +#define aJson_False 0 +#define aJson_True 1 +#define aJson_NULL 2 +#define aJson_Int 3 +#define aJson_Float 4 +#define aJson_String 5 +#define aJson_Array 6 +#define aJson_Object 7 + +#define aJson_IsReference 128 + +// The aJson structure: +typedef struct aJsonObject { + char *name; // The item's name string, if this item is the child of, or is in the list of subitems of an object. + struct aJsonObject *next, *prev; // next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem + struct aJsonObject *child; // An array or object item will have a child pointer pointing to a chain of the items in the array/object. + + char type; // The type of the item, as above. + + union { + char *valuestring; // The item's string, if type==aJson_String + char valuebool; //the items value for true & false + int valueint; // The item's number, if type==aJson_Number + double valuefloat; // The item's number, if type==aJson_Number + }; +} aJsonObject; + +class aJsonClass { + /****************************************************************************** + * Constructors + ******************************************************************************/ + + /****************************************************************************** + * User API + ******************************************************************************/ +public: + // Supply a block of JSON, and this returns a aJson object you can interrogate. Call aJson.deleteItem when finished. + aJsonObject* parse(FILE* stream); //Reads from a stream + aJsonObject* parse(FILE* stream,char** filter_values); //Read from a file, but only return values include in the char* array filter_values + aJsonObject* parse(char *value); //Reads from a string + // Render a aJsonObject entity to text for transfer/storage. Free the char* when finished. + int print(aJsonObject *item, FILE* stream); + char* print(aJsonObject* item); + //Renders a aJsonObject directly to a output stream + char stream(aJsonObject *item, FILE* stream); + // Delete a aJsonObject entity and all sub-entities. + void deleteItem(aJsonObject *c); + + // Returns the number of items in an array (or object). + unsigned char getArraySize(aJsonObject *array); + // Retrieve item number "item" from array "array". Returns NULL if unsuccessful. + aJsonObject* getArrayItem(aJsonObject *array, unsigned char item); + // Get item "string" from object. Case insensitive. + aJsonObject* getObjectItem(aJsonObject *object, const char *string); + + // These calls create a aJsonObject item of the appropriate type. + aJsonObject* createNull(); + aJsonObject* createTrue(); + aJsonObject* createFalse(); + aJsonObject* createItem(char b); + aJsonObject* createItem(int num); + aJsonObject* createItem(double num); + aJsonObject* createItem(const char *string); + aJsonObject* createArray(); + aJsonObject* createObject(); + + // These utilities create an Array of count items. + aJsonObject* createIntArray(int *numbers, unsigned char count); + aJsonObject* createFloatArray(double *numbers, unsigned char count); + aJsonObject* createDoubleArray(double *numbers, unsigned char count); + aJsonObject* createStringArray(const char **strings, unsigned char count); + + // Append item to the specified array/object. + void addItemToArray(aJsonObject *array, aJsonObject *item); + void addItemToObject(aJsonObject *object, const char *string, + aJsonObject *item); + // Append reference to item to the specified array/object. Use this when you want to add an existing aJsonObject to a new aJsonObject, but don't want to corrupt your existing aJsonObject. + void addItemReferenceToArray(aJsonObject *array, aJsonObject *item); + void addItemReferenceToObject(aJsonObject *object, const char *string, + aJsonObject *item); + + // Remove/Detach items from Arrays/Objects. + aJsonObject* detachItemFromArray(aJsonObject *array, unsigned char which); + void deleteItemFromArray(aJsonObject *array, unsigned char which); + aJsonObject* detachItemFromObject(aJsonObject *object, const char *string); + void deleteItemFromObject(aJsonObject *object, const char *string); + + // Update array items. + void replaceItemInArray(aJsonObject *array, unsigned char which, + aJsonObject *newitem); + void replaceItemInObject(aJsonObject *object, const char *string, + aJsonObject *newitem); + + void addNullToObject(aJsonObject* object, const char* name); + void addTrueToObject(aJsonObject* object, const char* name); + void addFalseToObject(aJsonObject* object, const char* name); + void addNumberToObject(aJsonObject* object, const char* name, int n); + void addNumberToObject(aJsonObject* object, const char* name, double n); + void addStringToObject(aJsonObject* object, const char* name, + const char* s); + +private: + aJsonObject* newItem(); + int parseNumber(aJsonObject *item, FILE* stream); + int printInt(aJsonObject *item, FILE* stream); + int printFloat(aJsonObject *item, FILE* stream); + + int parseString(aJsonObject *item, FILE* stream); + int printStringPtr(const char *str, FILE* stream); + int printString(aJsonObject *item, FILE* stream); + + int skip(FILE* stream); + + int parseValue(aJsonObject *item, FILE* stream, char** filter); + int printValue(aJsonObject *item, FILE* stream); + + int parseArray(aJsonObject *item, FILE* stream, char** filter); + int printArray(aJsonObject *item, FILE* stream); + + int parseObject(aJsonObject *item, FILE* stream, char** filter); + int printObject(aJsonObject *item, FILE* stream); + void suffixObject(aJsonObject *prev, aJsonObject *item); + + aJsonObject* createReference(aJsonObject *item); + +}; + +extern aJsonClass aJson; + +#endif