查询Mysql表之后将结果转换为json时如何能够保持字段的原有数据类型?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询Mysql表之后将结果转换为json时如何能够保持字段的原有数据类型?相关的知识,希望对你有一定的参考价值。
$rs = mysql_query("select count(*) from $table_name"); #获得记录总数
$row = mysql_fetch_row($rs); #获得查询结果作为数组
$result["total"] = $row[0]; #查询结果只有一条记录$row[0],记录有几笔资料
$rs = mysql_query("select * from $table_name limit $offset,$rows");#查询当前页码所对应的所有记录
$items = array();
while($row = mysql_fetch_object($rs))
array_push($items, $row); #向$items数组的尾部逐一循环添加一个或多个元素(入栈),然后返回新数组的长度
$result["rows"] = $items; #带有字符串键的数组下标,存放实际的记录资料的阵列集
echo json_encode($result);
解决了!在array_push()添加到新的数组之前可以先对 (row->字段名称)的字段内容作类型上的转换。
默认返回的都是字符串。追问
http://zhidao.baidu.com/question/1239368523428137339.html
嗯,能不能够帮助查看一下这个问题,你知道如何解答吗
我们知道,JSON是一种轻量级的数据交互的格式,大部分NO SQL数据库的存储都用JSON。MySQL从5.7开始支持JSON格式的数据存储,并且新增了很多JSON相关函数。MySQL 8.0 又带来了一个新的把JSON转换为TABLE的函数JSON_TABLE,实现了JSON到表的转换。
举例一
我们看下简单的例子:
简单定义一个两级JSON 对象
mysql> set @ytt='"name":["a":"ytt","b":"action", "a":"dble","b":"shard","a":"mysql","b":"oracle"]';Query OK, 0 rows affected (0.00 sec)
第一级:
mysql> select json_keys(@ytt);+-----------------+| json_keys(@ytt) |+-----------------+| ["name"] |+-----------------+1 row in set (0.00 sec)
第二级:
mysql> select json_keys(@ytt,'$.name[0]');+-----------------------------+| json_keys(@ytt,'$.name[0]') |+-----------------------------+| ["a", "b"] |+-----------------------------+1 row in set (0.00 sec)
我们使用MySQL 8.0 的JSON_TABLE 来转换 @ytt。
mysql> select * from json_table(@ytt,'$.name[*]' columns (f1 varchar(10) path '$.a', f2 varchar(10) path '$.b')) as tt;
+-------+--------+
| f1 | f2 |
+-------+--------+
| ytt | action |
| dble | shard |
| mysql | oracle |
+-------+--------+
3 rows in set (0.00 sec)
举例二
再来一个复杂点的例子,用的是EXPLAIN 的JSON结果集。
JSON 串 @json_str1。
set @json_str1 = ' "query_block": "select_id": 1, "cost_info": "query_cost": "1.00" , "table": "table_name": "bigtable", "access_type": "const", "possible_keys": [ "id" ], "key": "id", "used_key_parts": [ "id" ], "key_length": "8", "ref": [ "const" ], "rows_examined_per_scan": 1, "rows_produced_per_join": 1, "filtered": "100.00", "cost_info": "read_cost": "0.00", "eval_cost": "0.20", "prefix_cost": "0.00", "data_read_per_join": "176" , "used_columns": [ "id", "log_time", "str1", "str2" ] ';
第一级:
mysql> select json_keys(@json_str1) as 'first_object';+-----------------+| first_object |+-----------------+| ["query_block"] |+-----------------+1 row in set (0.00 sec)
第二级:
mysql> select json_keys(@json_str1,'$.query_block') as 'second_object';+-------------------------------------+| second_object |+-------------------------------------+| ["table", "cost_info", "select_id"] |+-------------------------------------+1 row in set (0.00 sec)
第三级:
mysql> select json_keys(@json_str1,'$.query_block.table') as 'third_object'\\G*************************** 1. row ***************************third_object: ["key","ref","filtered","cost_info","key_length","table_name","access_type","used_columns","possible_keys","used_key_parts","rows_examined_per_scan","rows_produced_per_join"]1 row in set (0.01 sec)
第四级:
mysql> select json_extract(@json_str1,'$.query_block.table.cost_info') as 'forth_object'\\G*************************** 1. row ***************************forth_object: "eval_cost":"0.20","read_cost":"0.00","prefix_cost":"0.00","data_read_per_join":"176"1 row in set (0.00 sec)
那我们把这个JSON 串转换为表。
SELECT * FROM JSON_TABLE(@json_str1,
"$.query_block"
COLUMNS(
rowid FOR ORDINALITY,
NESTED PATH '$.table'
COLUMNS (
a1_1 varchar(100) PATH '$.key',
a1_2 varchar(100) PATH '$.ref[0]',
a1_3 varchar(100) PATH '$.filtered',
nested path '$.cost_info'
columns (
a2_1 varchar(100) PATH '$.eval_cost' ,
a2_2 varchar(100) PATH '$.read_cost',
a2_3 varchar(100) PATH '$.prefix_cost',
a2_4 varchar(100) PATH '$.data_read_per_join'
),
a3 varchar(100) PATH '$.key_length',
a4 varchar(100) PATH '$.table_name',
a5 varchar(100) PATH '$.access_type',
a6 varchar(100) PATH '$.used_key_parts[0]',
a7 varchar(100) PATH '$.rows_examined_per_scan',
a8 varchar(100) PATH '$.rows_produced_per_join',
a9 varchar(100) PATH '$.key'
),
NESTED PATH '$.cost_info'
columns (
b1_1 varchar(100) path '$.query_cost'
),
c INT path "$.select_id"
)
) AS tt;
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+
| rowid | a1_1 | a1_2 | a1_3 | a2_1 | a2_2 | a2_3 | a2_4 | a3 | a4 | a5 | a6 | a7 | a8 | a9 | b1_1 | c |
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+
| 1 | id | const | 100.00 | 0.20 | 0.00 | 0.00 | 176 | 8 | bigtable | const | id | 1 | 1 | id | NULL | 1 |
| 1 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1.00 | 1 |
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+
2 rows in set (0.00 sec)
当然,JSON_table 函数还有其他的用法,我这里不一一列举了,详细的参考手册。
请点击输入图片描述
修改回答
知道原因了,主要是php查询语句通过PHP mysql_fetch_object() 函数
获取查询结果所得到的数据类型默认的时候全部都转换为字符串了,[见: http://zhidao.baidu.com/question/681282588811968852.html]
但是你说的这个组装json之前的数据类型转换我可不会啊.
PHP没有将字符串转整形的方法吗,这应该都和Java类似吧,你后台能从数据库获取数据了,处理数据还有什么问题吗,主要PHP我不懂,只能说说建议
本回答被提问者和网友采纳如何获取所有mysql元组结果并转换为json
【中文标题】如何获取所有mysql元组结果并转换为json【英文标题】:how to get all mysql tuple result and convert to json 【发布时间】:2014-04-14 11:39:55 【问题描述】:我能够从表中获取单个数据。但是当我试图获取我表上的所有数据时,我只有一行。
cnn.execute(sql)
rows = cnn.fetchall()
column = [t[0] for t in cnn.description]
for row in rows:
myjson = column[0]: row[0], column[1]: row[1], column[2]: row[2], column[3]: row[3], column[4]: row[4], column[5]: row[5], column[6]: row[6], column[7]: row[7], column[8]: row[8], column[9]: row[9], column[10]: row[10], column[11]: row[11], column[12]: row[12], column[13]: row[13], column[14]: row[14], column[15]: row[15], column[16]: row[16], column[17]: row[17], column[18]: row[18], column[19]: row[19], column[20]: row[20]
myresult = json.dumps(myjson, indent=3)
return myresult
【问题讨论】:
【参考方案1】:现在,在 PyMysql 中,有一个工具可以配置您的连接以使用 cursorClass,它默认生成 Dictionary 作为输出。 (因此在返回 API 结果时直接工作,因为它被转换为 JSON)
来自 PyMysql 的documentation:将您的连接配置为
# Connect to the database
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
result = cursor.fetchone()
print(result)
这个结果的输出:
'password': 'very-secret', 'id': 1
【讨论】:
【参考方案2】:您无需指定“硬编码”键值映射,而是使用zip()
(或itertools.izip())。
另外,收集列表中的行,然后将结果转储到 json:
def dictfetchall(cursor):
"""Returns all rows from a cursor as a list of dicts"""
desc = cursor.description
return [dict(itertools.izip([col[0] for col in desc], row))
for row in cursor.fetchall()]
用法:
results = dictfetchall(cursor)
json_results = json.dumps(results)
希望对您有所帮助。
【讨论】:
【参考方案3】:您的 return 语句位于 for 循环内,因此在单次迭代后它将立即返回 myresult
的值。
【讨论】:
【参考方案4】:是的,@metatoaster 是对的,
试试这个:
cnn.execute(sql)
rows = cnn.fetchall()
column = [t[0] for t in cnn.description]
for row in rows:
myjson = column[0]: row[0], column[1]: row[1], column[2]: row[2], column[3]: row[3], column[4]: row[4], column[5]: row[5], column[6]: row[6], column[7]: row[7], column[8]: row[8], column[9]: row[9], column[10]: row[10], column[11]: row[11], column[12]: row[12], column[13]: row[13], column[14]: row[14], column[15]: row[15], column[16]: row[16], column[17]: row[17], column[18]: row[18], column[19]: row[19], column[20]: row[20]
myresult = json.dumps(myjson, indent=3)
return myresult
【讨论】:
这仍然只返回 1 行。【参考方案5】:#imports
import collections
import MySQLdb
import json
#connect to database
conn = MySQLdb.connect(host= "localhost", user="root", passwd="abc", db="mydatabase")
#Fetch rows
sql = "SELECT * from userstable"
cursor = conn.cursor()
cursor.execute(sql)
data = cursor.fetchall()
#Converting data into json
user_list = []
for row in data :
d = collections.OrderedDict()
d['firstName'] = row[1] #name
d['lastName'] = row[2] #lname
d['email'] = row[3] #email
user_list.append(d)
return json.dumps(user_list)
##Result
["firstName":"jame","lastName":"king","email":"test@gmail.com"]
【讨论】:
以上是关于查询Mysql表之后将结果转换为json时如何能够保持字段的原有数据类型?的主要内容,如果未能解决你的问题,请参考以下文章