python json 字符串,字典转换操作,json Decimal类型处理问题,中文乱码问题。
python json转换有点小费尽,这里标记一下。
JSON: TypeError: Decimal('34.3') is not JSON serializable [duplicate]
import json
from api_py_connector.cdCconnector.api_utils import DecimalEncoder
from commons.DFSQLAdmin import DFSQLAdmin
if __name__ == "__main__":
"""
json str->loads->dict->dumps->str 处理
"""
sql = "select downloadLink,errorCount,typeData,fileDataNum,dbDataNum,fileDataMoney,dbDataMoney from %s where id=%s" % (
'zt_check_statement_merge', 19)
db_conn = DFSQLAdmin().engine.connect()
query_data = db_conn.execute(sql).fetchone()
print(query_data)
typeData = json.loads(query_data[2]) # 字符串转json
print(type(typeData)) # dict
print(typeData) # {'payType': 1, 'payTypeName': '支付宝'}
print('fileDataNum' not in typeData)
if 'fileDataNum' not in typeData:
typeData['fileDataNum'] = query_data[3]
typeData['dbDataNum'] = query_data[4]
typeData['fileDataMoney'] = query_data[5]
typeData['dbDataMoney'] = query_data[6]
typeDataStr = json.dumps(typeData, cls=DecimalEncoder, ensure_ascii=False) # dict 转字符串, Decimal编码处理
# .decode('utf8').encode('gb2312')
print(typeDataStr)
"""print {"payType": 1, "payTypeName": "支付宝", "fileDataNum": 35644,
"dbDataNum": 15, "fileDataMoney": 954032.4, "dbDataMoney": 454.0}"""
print(type(typeDataStr))
sql = "update %s set typeData='%s' where id=%s" % ('zt_check_statement_merge', typeDataStr, 19)
print(sql)
"""print sql=
update zt_check_statement_merge set typeData=
'{"payType": 1, "payTypeName": "支付宝", "fileDataNum": 35644,
"dbDataNum": 15, "fileDataMoney": 954032.4, "dbDataMoney": 454.0}'
where id=19
"""
db_conn.execute(sql)
db_conn.close()
class DecimalEncoder(json.JSONEncoder):
"""
json Decimal编码处理
"""
def default(self, o):
if isinstance(o, decimal.Decimal):
return float(o)
return super(DecimalEncoder, self).default(o)