[ https://issues.apache.org/jira/browse/THRIFT-2859?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14235216#comment-14235216 ]
Stig Bakken commented on THRIFT-2859: ------------------------------------- What about this patch (based on Konrad's, but setting precision for doubles and fixing an indent bug): {code} diff --git a/compiler/cpp/src/generate/t_json_generator.cc b/compiler/cpp/src/generate/t_json_generator.cc index cbf3883..e79c9b4 100644 --- a/compiler/cpp/src/generate/t_json_generator.cc +++ b/compiler/cpp/src/generate/t_json_generator.cc @@ -91,6 +91,14 @@ private: return out.str(); } + template <typename T> + void write_number(T n) { + std::ostringstream out; + out.precision(9); + out << n; + f_json_ << out.str(); + } + string get_type_name(t_type* ttype); string get_qualified_name(t_type* ttype); @@ -110,8 +118,6 @@ private: void write_type_spec_object(const char* name, t_type* ttype); void write_type_spec(t_type* ttype); void write_string(const string& value); - void write_integer(long value); - void write_double(double value); void write_value(t_type* tvalue); void write_const_value(t_const_value* value, bool force_string = false); void write_key_and(string key); @@ -435,14 +441,6 @@ void t_json_generator::write_string(const string& value) { f_json_ << quot << escape_json_string(value) << quot; } -void t_json_generator::write_integer(long value) { - f_json_ << to_string(value); -} - -void t_json_generator::write_double(double value) { - f_json_ << to_string(value); -} - void t_json_generator::write_const_value(t_const_value* value, bool should_force_string) { switch (value->get_type()) { @@ -452,7 +450,7 @@ void t_json_generator::write_const_value(t_const_value* value, bool should_force if (should_force_string) { write_string(to_string(value->get_integer())); } else { - write_integer(value->get_integer()); + write_number(value->get_integer()); } break; @@ -460,7 +458,7 @@ void t_json_generator::write_const_value(t_const_value* value, bool should_force if (should_force_string) { write_string(to_string(value->get_double())); } else { - write_double(value->get_double()); + write_number(value->get_double()); } break; @@ -474,6 +472,7 @@ void t_json_generator::write_const_value(t_const_value* value, bool should_force std::vector<t_const_value*>::iterator lit; for (lit = list.begin(); lit != list.end(); ++lit) { write_comma_if_needed(); + f_json_ << indent(); write_const_value(*lit); indicate_comma_needed(); } @@ -487,6 +486,7 @@ void t_json_generator::write_const_value(t_const_value* value, bool should_force std::map<t_const_value*, t_const_value*>::iterator mit; for (mit = map.begin(); mit != map.end(); ++mit) { write_comma_if_needed(); + f_json_ << indent(); // JSON objects only allow string keys write_const_value(mit->first, FORCE_STRING); f_json_ << ": "; {code} > JSON generator: output complete descriptors > ------------------------------------------- > > Key: THRIFT-2859 > URL: https://issues.apache.org/jira/browse/THRIFT-2859 > Project: Thrift > Issue Type: Improvement > Components: JSON - Compiler > Affects Versions: 0.9.2 > Reporter: Stig Bakken > Assignee: Jens Geyer > Priority: Minor > Fix For: 0.9.3 > > > (Someone should probably add a Jira component for the JSON generator.) > The attached pull request contains some improvements to the JSON generator: > 1. programs are no longer merged by default, use "--gen json:merge" > 2. "index" is renamed to "key" for fields to match the compiler's internal > naming > 3. types are described in a way that does not require string parsing > 4. full support for exceptions, unions, namespaces, includes and > required/optional fields -- This message was sent by Atlassian JIRA (v6.3.4#6332)