text: #!/usr/bin/env python
  # -*- encoding: utf-8 -*-
  """
  Topic: JSON读写
  Desc :
  """
  import json
  from collections import OrderedDict
  
  
  class JSONObject:
      def __init__(self, d):
          self.__dict__ = d
  
  
  class Point:
      def __init__(self, x, y):
          self.x = x
          self.y = y
  
  
  def serialize_instance(obj):
      d = {'__classname__': type(obj).__name__}
      d.update(vars(obj))
      return d
  
  
  def unserialize_object(d):
      clsname = d.pop('__classname__', None)
      if clsname:
          cls = classes[clsname]
          obj = cls.__new__(cls)  # Make instance without calling __init__
          for key, value in d.items():
              setattr(obj, key, value)
              return obj
      else:
          return d
  
  # Dictionary mapping names to known classes
  classes = {
      'Point': Point
  }
  
  
  def rw_json():
      data = {
          'name': 'ACME',
          'shares': 100,
          'price': 542.23
      }
  
      json_str = json.dumps(data)  # str类型
      data = json.loads(json_str)
  
      # Writing JSON data
      with open('data.json', 'w') as f:
          json.dump(data, f)
  
      # Reading data back
      with open('data.json', 'r') as f:
          data = json.load(f)
  
      # 使用object_pairs_hook
      s = '{"name": "ACME", "shares": 50, "price": 490.1}'
      data = json.loads(s, object_pairs_hook=OrderedDict)
      print(data)
  
      # 解码为自定义对象
      # data = json.loads(s, object_hook=JSONObject)
      # print(data.name)
      # print(data.shares)
  
      print(json.dumps(data))
      print(json.dumps(data, indent=4))
  
      p = Point(2, 3)
      s = json.dumps(p, default=serialize_instance)
      print(s)
      a = json.loads(s, object_hook=unserialize_object)
      print(a)
  
  
  if __name__ == '__main__':
      rw_json()
  
  