32 行
1.0 KiB
Python
32 行
1.0 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
|
from _ctypes import PyObj_FromPtr
|
|
import json, re
|
|
|
|
class NoIndent(object):
|
|
""" Value wrapper. """
|
|
def __init__(self, value):
|
|
self.value = value
|
|
|
|
class MyEncoder(json.JSONEncoder):
|
|
FORMAT_SPEC = '@@{}@@'
|
|
regex = re.compile(FORMAT_SPEC.format(r'(\d+)'))
|
|
|
|
def __init__(self, **kwargs):
|
|
super(MyEncoder, self).__init__(**kwargs)
|
|
|
|
def default(self, obj):
|
|
return (self.FORMAT_SPEC.format(id(obj)) if isinstance(obj, NoIndent)
|
|
else super(MyEncoder, self).default(obj))
|
|
|
|
def encode(self, obj):
|
|
format_spec = self.FORMAT_SPEC # Local var to expedite access.
|
|
json_repr = super(MyEncoder, self).encode(obj) # Default JSON.
|
|
for match in self.regex.finditer(json_repr):
|
|
id = int(match.group(1))
|
|
no_indent = PyObj_FromPtr(id)
|
|
json_obj_repr = json.dumps(no_indent.value)
|
|
json_repr = json_repr.replace(
|
|
'"{}"'.format(format_spec.format(id)), json_obj_repr)
|
|
|
|
return json_repr |