import jsonimport codecsdef utf16_le_to_utf_8(data): decode = codecs.getdecoder('utf_16_le') rv = decode(data)[0] return rvdef _to_json_obj(src, anchor=None): def _judge_anchor(_item, _src, _anchor): __anchor = _anchor if isinstance(_src, (tuple, list, dict)) else _src _valid_item = True if not isinstance(_anchor, type(_item)) else False return _valid_item, __anchor def _build_in_to_json_obj(_src): if isinstance(_src, bytes): _dst = utf16_le_to_utf_8(_src) else: _dst = _src return _dst def _list_to_json_obj(_src, _anchor=None): _dst = [] for i in range(0, len(_src)): _dst.append(_to_json_obj(_src[i], anchor=_anchor)) return _dst def _dict_to_json_obj(_src, _anchor=None): _dst = dict() for k, v in _src.items(): _dst[k] = _to_json_obj(v, anchor=_anchor) return _dst def _class_to_json_obj(_src, _anchor=None): _dst = dict() for k, v in _src.__dict__.items(): valid_item, __anchor = _judge_anchor(v, _src, _anchor) if valid_item: _dst[k] = _to_json_obj(v, anchor=__anchor) return _dst if isinstance(src, (type(None), bool, int, float, str, bytes)): dst = _build_in_to_json_obj(src) elif isinstance(src, (list, tuple)): dst = _list_to_json_obj(src, _anchor=anchor) elif isinstance(src, dict): dst = _dict_to_json_obj(src, _anchor=anchor) else: dst = _class_to_json_obj(src, _anchor=anchor) return dstdef to_json_str(anything): obj = _to_json_obj(anything) return json.dumps(obj, indent=4, ensure_ascii=False)