Index: Nevow/nevow/test/test_json.py
===================================================================
--- Nevow/nevow/test/test_json.py	(revision 5464)
+++ Nevow/nevow/test/test_json.py	(working copy)
@@ -10,14 +10,6 @@
     None,
     True,
     False,
-    u'string',
-    u'string with "embedded" quotes',
-    u"string with 'embedded' single-quotes",
-    u'string with \\"escaped embedded\\" quotes',
-    u"string with \\'escaped embedded\\' single-quotes",
-    u"string with backslashes\\\\",
-    u"string with trailing accented vowels: \xe1\xe9\xed\xf3\xfa\xfd",
-    u"string with trailing control characters: \f\b\n\t\r",
     [],
     [0],
     [0, 1, 2],
@@ -34,7 +26,20 @@
     {u'baz': [1, 2, 3]},
     {u'quux': {u'bar': u'foo'}}]
 
+TEST_STRINGLIKE_OBJECTS = [
+    #u'',
+    u'string',
+    u'string with "embedded" quotes',
+    u"string with 'embedded' single-quotes",
+    u'string with \\"escaped embedded\\" quotes',
+    u"string with \\'escaped embedded\\' single-quotes",
+    u"string with backslashes\\\\",
+    u"string with trailing accented vowels: \xe1\xe9\xed\xf3\xfa\xfd",
+    u"string with trailing control characters: \f\b\n\t\r",
+    u'string with high codepoint characters: \u1111\u2222\u3333\u4444',
+    ]
 
+
 class JavascriptObjectNotationTestCase(unittest.TestCase):
 
     def testSerialize(self):
@@ -50,6 +55,15 @@
                 "Failed to roundtrip %r: %r (through %r)" % (
                     struct, unstruct, bytes))
 
+    def testStringlikeRountrip(self):
+        for struct in TEST_STRINGLIKE_OBJECTS:
+            bytes = json.serialize(struct)
+            unstruct = json.parse(bytes)
+            failMsg = "Failed to roundtrip %r: %r (through %r)" % (
+                    struct, unstruct, bytes)
+            self.assertEquals(unstruct, struct, failMsg)
+            self.assertEquals(type(unstruct), type(struct), failMsg)
+
     def testScientificNotation(self):
         self.assertEquals(json.parse('1e10'), 10**10)
         self.assertEquals(json.parse('1e0'), 1)
Index: Nevow/nevow/json.py
===================================================================
--- Nevow/nevow/json.py	(revision 5464)
+++ Nevow/nevow/json.py	(working copy)
@@ -140,6 +140,8 @@
 _stringExpr = re.compile(
     r'(?:\\x(?P<unicode>[a-fA-F0-9]{2})) # Match hex-escaped unicode' '\n'
     r'|' '\n'
+    r'(?:\\u(?P<unicode2>[a-fA-F0-9]{4})) # Match hex-escaped high unicode' '\n'
+    r'|' '\n'
     r'(?P<control>\\[fbntr\\"]) # Match escaped control characters' '\n',
     re.VERBOSE)
 
@@ -155,6 +157,8 @@
 
 def _stringSub(m):
     u = m.group('unicode')
+    if u is None:
+        u = m.group('unicode2')
     if u is not None:
         return unichr(int(u, 16))
     c = m.group('control')
