Python JSON module

Модуль Питона для работы с файлами JSON формата

Модуль Пітона для роботы с файлами JSON формату


Files :

Файлы :

Файли :

ul_json.zip

Converts Python objects to their JavaScript representation.
Also can write/read variables to/from .js files.

Конвертирует обьекты Python в их эквивалент в JavaScript.
Также может писать/читать переменные в/из .js файлы.

Конвертує об"єкти Python в їх эквівалент на JavaScript.
Також може писати/читати змінні у/з .js файли.



#!/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()