I cannot retrieve the exact JSON string dump (json.dumps
) that I store in Maya's fileInfo
.
>>> import pymel.core as pc
>>> json.dumps({'foo': 123})
'{"foo": 123}'
>>> pc.fileInfo['foo'] = json.dumps({'foo': 123})
>>> pc.fileInfo['foo']
u'{\\"foo\\": 123}'
>>> json.loads(pc.fileInfo['foo']) # this produces an error because of the escape sequence
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Program Files\Autodesk\Maya2011\bin\python26.zip\json\__init__.py", line 307, in loads
File "c:\Program Files\Autodesk\Maya2011\bin\python26.zip\json\decoder.py", line 319, in decode
File "c:\Program Files\Autodesk\Maya2011\bin\python26.zip\json\decoder.py", line 336, in raw_decode
File "c:\Program Files\Autodesk\Maya2011\bin\python26.zip\json\scanner.py", line 55, in iterscan
File "c:\Program Files\Autodesk\Maya2011\bin\python26.zip\json\decoder.py", line 171, in JSONObject
ValueError: Expecting property name: line 1 column 1 (char 1)
The problem is the when Maya stores a value it ensures that it's properly escaped. But when this string is retrieved its malformed for json.loads
. How can I fix this?
What I'm basically looking for is something that unescapes the escape sequence that MEL introduces while saving the value? So far I've failed to find anything that does this.
MEL has a lot of similarity with C so the escape sequence is mostly identical to that of C as demonstrated above.
The answer by @theodox is probably correct. But if you know that the json string will be escaped. You can simply get back the original unescaped version of the string with.
mystring.decode('unicode_escape')
so in the above case, the proper way to deserialize the stored info would be:
json.loads(pc.fileInfo['foo'].decode('unicode_escape'))
It looks little ugly though, so you can have it inside a function.
def safe_json_loads(str):
return json.loads(str.decode('unicode_escape'))
data = safe_json_loads(pc.fileInfo['foo'])
cheers,