diff --git a/playhouse/sqlite_ext.py b/playhouse/sqlite_ext.py index 22b0dedc..0cd8448d 100644 --- a/playhouse/sqlite_ext.py +++ b/playhouse/sqlite_ext.py @@ -88,7 +88,7 @@ class JSONPath(ColumnBase): if isinstance(idx, int) or idx == '#': item = '[%s]' % idx else: - item = '.%s' % idx + item = '."%s"' % idx.replace('"', '""') return type(self)(self._field, self._path + (item,)) def append(self, value, as_json=None): diff --git a/tests/sqlite.py b/tests/sqlite.py index 730d365e..7c946420 100644 --- a/tests/sqlite.py +++ b/tests/sqlite.py @@ -199,6 +199,16 @@ class TestJSONField(ModelTestCase): kd_db = KeyData.get(KeyData.key == 'kx') self.assertEqual(kd_db.data, value) + def test_key_with_special_chars(self): + kd = KeyData.create(key='k1', data={'k 1': {'k.. 2': {'{k3}': 'v4'}}}) + def assertMatch(expr): + obj = KeyData.select().where(expr.is_null(False)).get() + self.assertEqual(obj.key, 'k1') + + assertMatch(KeyData.data['k 1']) + assertMatch(KeyData.data['k 1']['k.. 2']) + assertMatch(KeyData.data['k 1']['k.. 2']['{k3}']) + def test_json_unicode(self): with self.database.atomic(): KeyData.delete().execute()