--- parser3/src/classes/json.C 2013/08/21 12:11:13 1.26 +++ parser3/src/classes/json.C 2014/05/04 01:38:01 1.30 @@ -12,13 +12,13 @@ #include "pa_charset.h" #include "pa_charsets.h" -#include "json.h" +#include "pa_json.h" #ifdef XML #include "pa_vxdoc.h" #endif -volatile const char * IDENT_JSON_C="$Id: json.C,v 1.26 2013/08/21 12:11:13 moko Exp $"; +volatile const char * IDENT_JSON_C="$Id: json.C,v 1.30 2014/05/04 01:38:01 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)) @@ -264,7 +275,7 @@ static void _parse(Request& r, MethodPar throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); } - const String::Body json_body = json_string.cstr_to_string_body_untaint(String::L_JSON, 0, &(r.charsets)); + const String::Body json_body = json_string.cstr_to_string_body_untaint(String::L_JSON, r.connection(false), &r.charsets); const char *json_cstr = json.charset != NULL ? Charset::transcode(json_body, *json.charset, UTF8_charset).cstr() : json_body.cstr(); json_parser parser; @@ -365,7 +376,7 @@ const String& value_json_string(String:: VMethodFrame frame(*junction->method, options.r->method_frame, junction->self); HashStringValue* params_hash=options.params && options.indent ? options.params->get_hash() : NULL; - Temp_hash_value indent(params_hash, "indent", new VString(*new String(options.indent))); + Temp_hash_value indent(params_hash, "indent", new VString(*new String(options.indent, String::L_AS_IS))); Value *params[]={new VString(*new String(key, String::L_JSON)), &v, options.params ? options.params : VVoid::get()}; frame.store_params(params, 3); @@ -447,7 +458,7 @@ static void _string(Request& r, MethodPa } const String& result_string=value_json_string(String::Body(), params[0], json); - String::Body result_body=result_string.cstr_to_string_body_untaint(String::L_JSON, 0, &r.charsets); + String::Body result_body=result_string.cstr_to_string_body_untaint(String::L_JSON, r.connection(false), &r.charsets); r.write_pass_lang(*new String(result_body, String::L_AS_IS)); }