the python json module is typically used for data sequence, such as
def get_user_info(user_id):
res = {"user_id": 190013234,"nick": "havana"}
json_str = json.dumps(res)
return json_str
But when you want to serialize the data which contains Chinese characters, will this be
import json
res = {"user_id": 190027134, "nick": "愚蠢的萝卜"}
print(json.dumps(res))
# {"nick": "\u611a\u8822\u7684\u841d\u535c", "user_id": 190027134}
Solution: Add a parameter in json.dumps () insideensure_ascii=False
import json
res = {"user_id": 190027134, "nick": "愚蠢的萝卜"}
print(json.dumps(res))
# {"nick": "愚蠢的萝卜", "user_id": 190027134}
There is a problem, if json structure is very complex, the resulting output will be a mess, is not clear, it is formatted so that it can add a parameter
import json
res = {"user_id": 190027134, "nick": "愚蠢的萝卜"}
print(json.dumps(res))
# {
"nick": "愚蠢的萝卜",
"user_id": 190027134
}
If the sequence of the data inside the python datetime.datetime type, then the error will be serialized
import datetime
res = {"user_id": 190027134, "nick": "愚蠢的萝卜", "reg_ts": datetime.datetime.now()}
print(json.dumps(res, ensure_ascii=False, indent=4))
#TypeError: datetime.datetime(2019, 11, 3, 19, 8, 45, 987000) is not JSON serializable
The solution is to use a custom jsonencoder instead of native jsonencoder
class DatetimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, obj)
res = {"user_id": 190027134, "nick": "愚蠢的萝卜", "reg_ts": datetime.datetime.now(), "last_login_date": datetime.date.today()}
print(json.dumps(res, ensure_ascii=False, indent=4, cls=DatetimeEncoder))
# {
"nick": "愚蠢的萝卜",
"user_id": 190027134,
"reg_ts": "2019-11-03 20:09:55",
"last_login_date": "2019-11-03"
}