--- parser3/src/classes/json.C 2010/09/24 08:18:57 1.8 +++ parser3/src/classes/json.C 2010/10/26 11:41:42 1.12 @@ -4,7 +4,7 @@ Copyright (c) 2010 ArtLebedev Group (http://www.artlebedev.com) */ -static const char * const IDENT_RESPONSE_C="$Date: 2010/09/24 08:18:57 $"; +static const char * const IDENT_RESPONSE_C="$Date: 2010/10/26 11:41:42 $"; #include "classes.h" #include "pa_vmethod_frame.h" @@ -21,8 +21,6 @@ static const char * const IDENT_RESPONSE class MJson: public Methoded { public: MJson(); -public: // Methoded - bool used_directly() { return true; } }; // global variable @@ -94,7 +92,7 @@ String* json_string(Json *json, const JS static Value *json_hook(Request &r, Junction *hook, String* key, Value* value){ VMethodFrame frame(*hook->method, r.method_frame, hook->self); - Value *params[]={new VString(*key), value}; + Value *params[]={new VString(key ? *key : String::Empty), value}; frame.store_params(params, 2); r.execute_method(frame); @@ -131,12 +129,13 @@ static int json_callback(Json *json, int } case JSON_T_ARRAY_BEGIN:{ VHash *v = new VHash(); - set_json_value(json, v); + if (json->stack.count()) set_json_value(json, v); json->stack.push(v); break; } case JSON_T_ARRAY_END: - json->stack.pop(); + // libjson supports array at top level, we too + json->result = json->stack.pop(); break; case JSON_T_KEY: json->key = json_string(json, value); @@ -249,7 +248,7 @@ char *get_indent(uint level){ if (!cache[level]){ char *result = static_cast(pa_gc_malloc_atomic(level+1)); memset(result, '\t', level); - result[level+1]='\0'; + result[level]='\0'; return cache[level]=result; } return cache[level]; @@ -350,7 +349,7 @@ static void _string(Request& r, MethodPa valid_options++; } else if(Junction* junction=value->get_junction()){ if(!junction->method || !junction->method->params_names || junction->method->params_names->count() != 2) - throw Exception(PARSER_RUNTIME, 0, "$.%s must be parser method with 2 parameters", key); + throw Exception(PARSER_RUNTIME, 0, "$.%s must be parser method with 2 parameters", key.cstr()); methods->put(key, value); valid_options++; }