diff --git a/spec/ParseObject.spec.js b/spec/ParseObject.spec.js index 907c15ca9e..5d8996559b 100644 --- a/spec/ParseObject.spec.js +++ b/spec/ParseObject.spec.js @@ -1736,4 +1736,33 @@ describe('Parse.Object testing', () => { }); }); + + it("should create nested keys with _", done => { + const object = new Parse.Object("AnObject"); + object.set("foo", { + "_bar": "_", + "baz_bar": 1, + "__foo_bar": true, + "_0": "underscore_zero", + "_more": { + "_nested": "key" + } + }); + object.save().then( res => { + ok(res); + return res.fetch(); + }).then( res => { + const foo = res.get("foo"); + expect(foo["_bar"]).toEqual("_"); + expect(foo["baz_bar"]).toEqual(1); + expect(foo["__foo_bar"]).toBe(true); + expect(foo["_0"]).toEqual("underscore_zero"); + expect(foo["_more"]["_nested"]).toEqual("key"); + done(); + }).fail( err => { + console.error(err); + fail("should not fail"); + done(); + }) + }) }); diff --git a/src/transform.js b/src/transform.js index 0e99b48836..936078cb71 100644 --- a/src/transform.js +++ b/src/transform.js @@ -586,7 +586,7 @@ function transformUpdateOperator(operator, flatten) { // Converts from a mongo-format object to a REST-format object. // Does not strip out anything based on a lack of authentication. -function untransformObject(schema, className, mongoObject) { +function untransformObject(schema, className, mongoObject, isNestedObject = false) { switch(typeof mongoObject) { case 'string': case 'number': @@ -683,10 +683,8 @@ function untransformObject(schema, className, mongoObject) { objectId: objData[1] }; break; - } else if (key[0] == '_' && key != '__type') { + } else if (!isNestedObject && key[0] == '_' && key != '__type') { throw ('bad key in untransform: ' + key); - //} else if (mongoObject[key] === null) { - //break; } else { var expectedType = schema.getExpectedType(className, key); var value = mongoObject[key]; @@ -700,7 +698,7 @@ function untransformObject(schema, className, mongoObject) { } } restObject[key] = untransformObject(schema, className, - mongoObject[key]); + mongoObject[key], true); } } return restObject;