93943b9bd3f5d6d9ef5a51e636636449b0c607b1 kent Mon Dec 9 11:10:26 2013 -0800 Separating out generic portable JSON parser from Genome Browser specific stuff in jsHelper module, creating jsonParse module. diff --git src/inc/jsonParse.h src/inc/jsonParse.h new file mode 100644 index 0000000..4c412c6 --- /dev/null +++ src/inc/jsonParse.h @@ -0,0 +1,132 @@ +/* jsonParse - routines to parse JSON strings and traverse and pick things out of the + * resulting object tree. */ + +#ifndef JSONPARSE_H +#define JSONPARSE_H + +/* JSON Element code let's you build up a DOM like data structure in memory and then serialize it into + html for communication with client side code. + */ + +// supported types + +typedef enum _jsonElementType +{ + jsonList = 0, + jsonObject = 1, + jsonNumber = 2, + jsonDouble = 3, + jsonBoolean = 4, + jsonString = 5 +} jsonElementType; + +union jsonElementVal +{ + struct slRef *jeList; + struct hash *jeHash; + long jeNumber; + double jeDouble; + boolean jeBoolean; + char *jeString; +}; + +struct jsonElement +{ + jsonElementType type; + union jsonElementVal val; +}; + +// constructors for each jsonElementType + +struct jsonElement *newJsonString(char *str); +struct jsonElement *newJsonBoolean(boolean val); +struct jsonElement *newJsonNumber(long val); +struct jsonElement *newJsonDouble(double val); +struct jsonElement *newJsonObject(struct hash *h); +struct jsonElement *newJsonList(struct slRef *list); + +void jsonObjectAdd(struct jsonElement *h, char *name, struct jsonElement *ele); +// Add a new element to a jsonObject; existing values are replaced. +// NOTE: Adding to a NULL hash will add to the global "common" hash printed with jsonPrintGlobals(); + +void jsonListAdd(struct jsonElement *list, struct jsonElement *ele); +// Add a new element to a jsonList + +struct jsonElement *jsonParse(char *str); +// parse string into an in-memory json representation + +char *jsonStringEscape(char *inString); +/* backslash escape a string for use in a double quoted json string. + * More conservative than javaScriptLiteralEncode because + * some json parsers complain if you escape & or ' */ + +void jsonFindNameRecurse(struct jsonElement *ele, char *jName, struct slName **pList); +// Search the JSON tree recursively to find all the values associated to +// the name, and add them to head of the list. + +struct slName *jsonFindName(struct jsonElement *json, char *jName); +// Search the JSON tree to find all the values associated to the name +// and add them to head of the list. + +struct slName *jsonFindNameUniq(struct jsonElement *json, char *jName); +// Search the JSON tree to find all the values associated to the name +// and add them to head of the list. + +void jsonElementRecurse(struct jsonElement *ele, char *name, boolean isLast, + void (*startCallback)(struct jsonElement *ele, char *name, boolean isLast, void *context), + // Called at element start + void (*endCallback)(struct jsonElement *ele, char *name, boolean isLast, void *context), + // Called at element end + void *context); +/* Recurse through JSON tree calling callback functions with element and context. + * Either startCallback or endCallback may be NULL, as can be name. */ + +void jsonPrintOneStart(struct jsonElement *ele, char *name, boolean isLast, int indent, FILE *f); +/* Print the start of one json element - just name and maybe an opening brace or bracket. + * Recursion is handled elsewhere. */ + +void jsonPrintOneEnd(struct jsonElement *ele, char *name, boolean isLast, boolean indent, FILE *f); +/* Print object end */ + +void jsonPrintToFile(struct jsonElement *root, char *name, FILE *f, int indentPer); +/* Print out JSON object and all children nicely indented to f as JSON objects. + * Name may be NULL. Implemented via jsonPrintOneStart/jsonPrintOneEnd. */ + +/** Routines that check json type and return corresponding value. **/ + +struct slRef *jsonListVal(struct jsonElement *ele, char *name); +/* Enforce element is type jsonList. Return list value */ + +struct hash *jsonObjectVal(struct jsonElement *ele, char *name); +/* Enforce object is type jsonObject. Return object hash */ + +long jsonNumberVal(struct jsonElement *ele, char *name); +/* Enforce element is type jsonNumber and return value. */ + +long jsonDoubleVal(struct jsonElement *ele, char *name); +/* Enforce element is type jsonDouble and return value. */ + +long jsonBooleanVal(struct jsonElement *ele, char *name); +/* Enforce element is type jsonBoolean and return value. */ + +char *jsonStringVal(struct jsonElement *ele, char *eleName); +/* Enforce element is type jsonString and return value. */ + +/** Routines that help work with json objects (bracket enclosed key/val pairs **/ + +struct jsonElement *jsonFindNamedField(struct jsonElement *object, + char *objectName, char *field); +/* Find named field of object or return NULL if not found. Abort if object + * is not actually an object. */ + +struct jsonElement *jsonMustFindNamedField(struct jsonElement *object, + char *objectName, char *field); +/* Find named field of object or die trying. */ + +char *jsonOptionalStringField(struct jsonElement *object, char *field, char *defaultVal); +/* Return string valued field of object, or defaultVal if it doesn't exist. */ + +char *jsonStringField(struct jsonElement *object, char *field); +/* Return string valued field of object or abort if field doesn't exist. */ + +#endif /* JSONPARSE_H */