--- parser3/src/classes/json.C 2013/10/29 13:29:24 1.29 +++ parser3/src/classes/json.C 2014/06/29 05:55:35 1.32 @@ -18,7 +18,7 @@ #include "pa_vxdoc.h" #endif -volatile const char * IDENT_JSON_C="$Id: json.C,v 1.29 2013/10/29 13:29:24 moko Exp $"; +volatile const char * IDENT_JSON_C="$Id: json.C,v 1.32 2014/06/29 05:55:35 misha Exp $"; // class @@ -47,10 +47,12 @@ struct Json { String::Language taint; bool handle_double; + bool handle_int; enum Distinct { D_EXCEPTION, D_FIRST, D_LAST, D_ALL } distinct; Json(Charset* acharset): stack(), key_stack(), key(NULL), result(NULL), hook_object(NULL), hook_array(NULL), - request(NULL), charset(acharset), taint(String::L_TAINTED), handle_double(true), distinct(D_EXCEPTION){} + request(NULL), charset(acharset), taint(String::L_TAINTED), handle_double(true), handle_int(true), + distinct(D_EXCEPTION){} bool set_distinct(const String &value){ if (value == "first") distinct = D_FIRST; @@ -165,7 +167,12 @@ static int json_callback(Json *json, int json->key = json_string(json, value, length); break; case JSON_INT: - set_json_value(json, new VDouble( json_string(json, value, length)->as_double() )); + if (json->handle_int){ + set_json_value(json, new VDouble( json_string(json, value, length)->as_double() )); + } else { + // JSON_STRING + set_json_value(json, new VString(*json_string(json, value, length))); + } break; case JSON_FLOAT: if (json->handle_double){ @@ -236,6 +243,10 @@ static void _parse(Request& r, MethodPar json.handle_double=r.process_to_value(*value).as_bool(); valid_options++; } + if(Value* value=options->get("int")) { + json.handle_int=r.process_to_value(*value).as_bool(); + valid_options++; + } if(Value* value=options->get("distinct")) { const String& sdistinct=value->as_string(); if (!json.set_distinct(sdistinct)) @@ -358,7 +369,7 @@ const String& value_json_string(String:: Value* method=options.methods->get(v.type()); if(!method){ method=options.methods->first_that(based_on, &v); - options.methods->put(key, method ? method : VVoid::get()); + options.methods->put(v.type(), method ? method : VVoid::get()); } if(method && !method->is_void()) { Junction* junction=method->get_junction(); @@ -416,6 +427,11 @@ static void _string(Request& r, MethodPa if(!json.set_file_format(svalue)) throw Exception(PARSER_RUNTIME, &svalue, "must be 'base64', 'text' or 'stat'"); valid_options++; + } else if(key == "void" && value->is_string()){ + const String& svalue=value->as_string(); + if(!json.set_void_format(svalue)) + throw Exception(PARSER_RUNTIME, &svalue, "must be 'string' or 'null'"); + valid_options++; #ifdef XML } else if(key == "xdoc" && (vvalue = value->get_hash())){ json.xdoc_options=new XDocOutputOptions();