Converts Python objects to their JavaScript representation.
Also can write/read variables to/from .js files.
#!/bin/env python # -*- coding: utf-8 -*- ''' Converts Python objects to their JavaScript representation and back, reads/writes corresponding JavaScript objects from/to .js data files ''' import re # symbols used in JSON json_begin_array = u'[' # Array opening symbol json_end_array = u']' # Array closing symbol json_begin_object = u'{' # Object opening symbol json_end_object = u'}' # Object closing symbol json_name_separator = u':' # Object name and value separator json_value_separator = u',' # Array, Object items separator json_begin_var = u'var' # JS variable assigning operator json_end_var = u';;;;' # variable closing json_assign_var = u'=' # variable assigning json_begin_str = u'\'' # string opening quote json_end_str = u'\'' # string closing quote # JS special values json_null = u'null' json_false = u'false' json_true = u'true' #default strings encoding str_def_enc = 'utf-8' def pystr_to_jsstr(str_in, str_enc = str_def_enc) : ''' converts Python str/unicode to escaped JavaScript unicode string using encoding str_enc ''' #if string, convert to Unicode if isinstance(str_in, str) : str_in = str_in.decode(str_enc) str_out = str_in.encode('raw_unicode_escape').encode('string_escape').replace('\\\\u', '\\u') return str_out def jsstr_to_pystr(str_in) : ''' converts JavaScript object-string to Python object-string, replacing null,false,true with None,False,True ''' #resulting string str_out = str_in.replace(json_null, 'None').replace(json_false, 'False').replace(json_true, 'True') #print 'str_in : ', str_in, type(str_in) return str_out def pyobj_to_jsstr(obj_in, str_enc = str_def_enc) : ''' recursively converts Python object obj_in (num, str, list, dict etc.) to it's JSON string representation, converts strings to JavaScript escaped unicode using encoding str_enc ''' str_out = u'' #resulting string if obj_in is None : #None object str_out += json_null elif obj_in is False : #False object str_out += json_false elif obj_in is True : #True object str_out += json_true elif isinstance(obj_in, (str, unicode)) : # str/unicode - return escaped Unicode representation str_out += json_begin_str + pystr_to_jsstr(obj_in, str_enc) + json_end_str elif isinstance(obj_in, (int, long, float)) : # int,long,float str_out += str(obj_in) elif isinstance(obj_in, (tuple, list)) : #tuple or list - convert to array str_out += json_begin_array for obj_items_cnt in range(len(obj_in)) : #iterate through all items str_out += pyobj_to_jsstr(obj_in[obj_items_cnt]) if obj_items_cnt != (len(obj_in) - 1) : str_out += json_value_separator str_out += json_end_array elif isinstance(obj_in, dict) : #dict - convert to object (supported only string/numeric keys) str_out += json_begin_object obj_in_keys = obj_in.keys() for obj_key_cnt in range(len(obj_in_keys)) : #iterate through all keys str_out += pyobj_to_jsstr(obj_in_keys[obj_key_cnt]) str_out += json_name_separator str_out += pyobj_to_jsstr(obj_in[obj_in_keys[obj_key_cnt]]) if obj_key_cnt != (len(obj_in_keys) - 1) : str_out += json_value_separator str_out += json_end_object else : str_out += pyobj_to_jsstr(str(obj_in)) # unknown object - return it's string representation return str_out def pyobj_to_jsvar(obj_in, var_name, str_enc = str_def_enc) : ''' converts Python object obj_in (num, str, list, dict etc.) to JavaScript var_name variable assignment ''' return json_begin_var + ' ' + var_name + ' ' + json_assign_var + ' ' + pyobj_to_jsstr(obj_in, str_enc) + json_end_var + u'\n'; def jsvars_to_pydict(str_in) : ''' converts JavaScript string containing variable(s) assignment to Python dict : {var1 : obj1, var2 : obj2} ''' jsvar_re_str = '^' + re.escape(json_begin_var) + '\\W*?(\\w+?)\\W*?' + re.escape(json_assign_var) + '(\\W*?[\\w\\W]+?\\W*?)' + re.escape(json_end_var) + '\\n' jsvar_re = re.compile(jsvar_re_str, re.M | re.U); jsvars = jsvar_re.split(str_in) if ((len(jsvars) % 2) == 1) : jsvars = jsvars[:-1] dict_out = {} jsvars_cnt = 0 while jsvars_cnt < len(jsvars) : dict_out[jsvars[jsvars_cnt + 1]] = jsstr_to_pyobj(jsvars[jsvars_cnt + 2]) jsvars_cnt += 3 return dict_out def jsstr_to_pyobj(str_in) : ''' converts JavaScript string to Python object using Python's eval ''' #unescape escaped unicode strings def strs_unescape(obj_in) : obj_out = obj_in if isinstance(obj_out, (str, unicode)) : # unescape string obj_out = obj_out.decode('raw_unicode_escape') elif isinstance(obj_out, (tuple, list)) : # iterate through all list items for obj_item_cnt in range(len(obj_out)) : obj_out[obj_item_cnt] = strs_unescape(obj_out[obj_item_cnt]) elif isinstance(obj_out, dict) : # iterate through all dict keys for obj_key in obj_out.keys() : obj_out[obj_key] = strs_unescape(obj_out[obj_key]) return obj_out try : #parse object and unescape unicode strings obj_out = strs_unescape(eval(jsstr_to_pystr(str_in))) except : obj_out = None return obj_out #module test if __name__ == '__main__' : # test object obj_in = {'ar' : [1, -0.12e-30, '1', u'йцук'], 'us' : u'йцук\'\"'} print 'obj_in : ', obj_in, '\n' print 'str_in : ', pyobj_to_jsstr(obj_in), '\n' # convert to JS variable print 'var : ', pyobj_to_jsvar(obj_in, 'cfg1'), '\n' # convert JS variables to dict print 'dict : ', jsvars_to_pydict(pyobj_to_jsvar(obj_in, 'cfg1') + pyobj_to_jsvar(obj_in, 'cfg2')), '\n' #write to js file open('ul_json_test_00.js', 'wb').write(pyobj_to_jsvar(obj_in, 'cfg1') + pyobj_to_jsvar(obj_in, 'cfg2')) #read from js file print 'file : ', jsvars_to_pydict(open('ul_json_test_00.js', 'rb').read()) raw_input()