zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #12611
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
Paul J. Lucas has proposed merging lp:~zorba-coders/zorba/bug-878508 into lp:zorba.
Requested reviews:
Paul J. Lucas (paul-lucas)
Related bugs:
Bug #878508 in Zorba: "JSON Module not escaping escape characters"
https://bugs.launchpad.net/zorba/+bug/878508
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/bug-878508/+merge/116781
Now properly serializing JSON for JsonML.
--
https://code.launchpad.net/~zorba-coders/zorba/bug-878508/+merge/116781
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/api/serialization/serializer.cpp'
--- src/api/serialization/serializer.cpp 2012-07-25 00:15:29 +0000
+++ src/api/serialization/serializer.cpp 2012-07-25 23:34:32 +0000
@@ -31,9 +31,9 @@
#include "api/unmarshaller.h"
#include "util/ascii_util.h"
+#include "util/json_util.h"
#include "util/string_util.h"
#include "util/unicode_util.h"
-#include "util/utf8_string.h"
#include "util/utf8_util.h"
#include "util/xml_util.h"
@@ -1208,47 +1208,7 @@
********************************************************************************/
void serializer::json_emitter::emit_json_string(zstring const &string)
{
- tr << '"';
- utf8_string<zstring const> const u( string );
- FOR_EACH( utf8_string<zstring const>, i, u ) {
- unicode::code_point const cp = *i;
- if ( ascii::is_cntrl( cp ) ) {
- switch ( cp ) {
- case '\b': tr << "\\b"; break;
- case '\f': tr << "\\f"; break;
- case '\n': tr << "\\n"; break;
- case '\r': tr << "\\r"; break;
- case '\t': tr << "\\t"; break;
- default: {
- std::ostringstream oss;
- oss << std::hex << std::setfill('0') << "\\u" << std::setw(4) << cp;
- tr << oss.str();
- }
- }
- continue;
- }
- if ( unicode::is_supplementary_plane( cp ) ) {
- unsigned high, low;
- unicode::convert_surrogate( cp, &high, &low );
- std::ostringstream oss;
- oss << std::hex << std::setfill('0')
- << "\\u" << std::setw(4) << high
- << "\\u" << std::setw(4) << low;
- tr << oss.str();
- continue;
- }
- switch ( cp ) {
- case '\\':
- case '"':
- tr << '\\';
- // no break;
- default: {
- utf8::encoded_char_type ec;
- tr.write( ec, utf8::encode( cp, ec ) );
- }
- }
- }
- tr << '"';
+ tr << '"' << json::serialize( string ) << '"';
}
=== modified file 'src/runtime/json/jsonml_array.cpp'
--- src/runtime/json/jsonml_array.cpp 2012-07-24 08:48:48 +0000
+++ src/runtime/json/jsonml_array.cpp 2012-07-25 23:34:32 +0000
@@ -26,6 +26,7 @@
#include "util/ascii_util.h"
#include "util/cxx_util.h"
#include "util/json_parser.h"
+#include "util/json_util.h"
#include "util/mem_streambuf.h"
#include "util/omanip.h"
#include "util/oseparator.h"
@@ -199,7 +200,7 @@
o << '"' << att_name << '"'
<< if_emit( ws, ' ' ) << ':' << if_emit( ws, ' ' )
- << '"' << att_item->getStringValue() << '"';
+ << '"' << json::serialize( att_item->getStringValue() ) << '"';
}
i->close();
if ( emitted_attributes )
@@ -242,7 +243,7 @@
o << sep << serialize_element( child, sep, ws );
break;
case store::StoreConsts::textNode:
- o << sep << '"' << child->getStringValue() << '"';
+ o << sep << '"' << json::serialize( child->getStringValue() ) << '"';
break;
default:
break;
=== modified file 'src/runtime/json/snelson.cpp'
--- src/runtime/json/snelson.cpp 2012-02-14 03:41:58 +0000
+++ src/runtime/json/snelson.cpp 2012-07-25 23:34:32 +0000
@@ -16,6 +16,7 @@
#include "stdafx.h"
#include <sstream>
+#include <string>
#include <zorba/diagnostic_list.h>
@@ -27,6 +28,7 @@
#include "util/cxx_util.h"
#include "util/indent.h"
#include "util/json_parser.h"
+#include "util/json_util.h"
#include "util/mem_streambuf.h"
#include "util/omanip.h"
#include "util/oseparator.h"
@@ -85,16 +87,6 @@
#define POP_ITEM_ELEMENT() \
if ( !IN_STATE( in_array ) ) ; else POP_ITEM()
-static void escape_json_chars( zstring *s ) {
- ascii::replace_all( *s, "\"", 1, "\\\"", 2 );
- ascii::replace_all( *s, "\\", 1, "\\\\", 2 );
- ascii::replace_all( *s, "\b", 1, "\\b", 2 );
- ascii::replace_all( *s, "\f", 1, "\\f", 2 );
- ascii::replace_all( *s, "\n", 1, "\\n", 2 );
- ascii::replace_all( *s, "\r", 1, "\\r", 2 );
- ascii::replace_all( *s, "\t", 1, "\\t", 2 );
-}
-
///////////////////////////////////////////////////////////////////////////////
namespace snelson {
@@ -172,10 +164,6 @@
case json::token::string:
ADD_TYPE_ATTRIBUTE( "string" );
value = token.get_value();
-#if 0
- escape_json_chars( &value );
-#endif
-
if ( next_string_is_key ) {
// <pair name="..." ...>
GENV_ITEMFACTORY->createQName( element_name, SNELSON_NS, "", "pair" );
@@ -344,10 +332,9 @@
DEF_OMANIP1( serialize_number, zstring const& )
static ostream& serialize_string( ostream &o, zstring const &s ) {
- zstring temp( s );
- escape_json_chars( &temp );
- temp.insert( (zstring::size_type)0, 1, '"' );
- temp.append( 1, '"' );
+ ostringstream oss;
+ oss << '"' << json::serialize( s ) << '"';
+ string const temp( oss.str() );
assert_json_type( json::string, temp );
return o << temp;
}
=== modified file 'src/util/CMakeLists.txt'
--- src/util/CMakeLists.txt 2012-07-24 08:48:48 +0000
+++ src/util/CMakeLists.txt 2012-07-25 23:34:32 +0000
@@ -21,6 +21,7 @@
fs_util.cpp
indent.cpp
json_parser.cpp
+ json_util.cpp
mem_streambuf.cpp
regex.cpp
string_util.cpp
=== added file 'src/util/json_util.cpp'
--- src/util/json_util.cpp 1970-01-01 00:00:00 +0000
+++ src/util/json_util.cpp 2012-07-25 23:34:32 +0000
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <iomanip>
+#include <iostream>
+
+#include "util/stl_util.h"
+#include "util/unicode_util.h"
+#include "util/utf8_util.h"
+
+using namespace std;
+
+namespace zorba {
+namespace json {
+
+///////////////////////////////////////////////////////////////////////////////
+
+ostream& serialize( ostream &os, char const *s ) {
+ while ( true ) {
+ unicode::code_point const cp = utf8::next_char( s );
+ if ( !cp )
+ break;
+ if ( ascii::is_cntrl( cp ) ) {
+ switch ( cp ) {
+ case '\b': os << "\\b"; break;
+ case '\f': os << "\\f"; break;
+ case '\n': os << "\\n"; break;
+ case '\r': os << "\\r"; break;
+ case '\t': os << "\\t"; break;
+ default: {
+ std::ostringstream oss;
+ oss << std::hex << std::setfill('0') << "\\u" << std::setw(4) << cp;
+ os << oss.str();
+ }
+ }
+ continue;
+ }
+ if ( unicode::is_supplementary_plane( cp ) ) {
+ unsigned high, low;
+ unicode::convert_surrogate( cp, &high, &low );
+ std::ostringstream oss;
+ oss << std::hex << std::setfill('0')
+ << "\\u" << std::setw(4) << high
+ << "\\u" << std::setw(4) << low;
+ os << oss.str();
+ continue;
+ }
+ switch ( cp ) {
+ case '\\':
+ case '"':
+ os << '\\';
+ // no break;
+ default: {
+ utf8::encoded_char_type ec;
+ os.write( ec, utf8::encode( cp, ec ) );
+ }
+ }
+ }
+ return os;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+} // namespace json
+} // namespace zorba
+/* vim:set et sw=2 ts=2: */
=== added file 'src/util/json_util.h'
--- src/util/json_util.h 1970-01-01 00:00:00 +0000
+++ src/util/json_util.h 2012-07-25 23:34:32 +0000
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ZORBA_JSON_UTIL_H
+#define ZORBA_JSON_UTIL_H
+
+#include <iostream>
+
+#include <zorba/config.h>
+
+#include "string_util.h"
+#include "omanip.h"
+
+namespace zorba {
+namespace json {
+
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Serializes the given string as a valid JSON string: any characters that must
+ * be escaped are escaped.
+ *
+ * @param os The ostream to serialize to.
+ * @param s The C string to serialize as JSON.
+ * @return Returns \a os.
+ */
+std::ostream& serialize( std::ostream &os, char const *s );
+
+// An ostream manipulator version of the above.
+DEF_OMANIP1( serialize, char const* )
+
+/**
+ * Serializes the given string as a valid JSON string: any characters that must
+ * be escaped are escaped.
+ *
+ * @tparam The string type.
+ * @param os The ostream to serialize to.
+ * @param s The string to serialize as JSON.
+ * @return Returns \a os.
+ */
+template<class StringType> inline
+typename std::enable_if<ztd::has_c_str<StringType,
+ char const* (StringType::*)() const>::value,
+ std::ostream&>::type
+serialize( std::ostream &os, StringType const &s ) {
+ return serialize( os, s.c_str() );
+}
+
+// An ostream manipulator version of the above.
+template<class StringType>
+DEF_OMANIP1( serialize, StringType const& )
+
+///////////////////////////////////////////////////////////////////////////////
+
+} // namespace json
+} // namespace zorba
+
+#endif /* ZORBA_JSON_UTIL_H */
+/* vim:set et sw=2 ts=2: */
Follow ups
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: noreply, 2012-07-26
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Zorba Build Bot, 2012-07-26
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Zorba Build Bot, 2012-07-26
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Chris Hillery, 2012-07-26
-
Re: [Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Chris Hillery, 2012-07-26
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Zorba Build Bot, 2012-07-26
-
Re: [Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Zorba Build Bot, 2012-07-26
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Zorba Build Bot, 2012-07-26
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Zorba Build Bot, 2012-07-25
-
Re: [Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Paul J. Lucas, 2012-07-25
-
[Merge] lp:~zorba-coders/zorba/bug-878508 into lp:zorba
From: Paul J. Lucas, 2012-07-25