2013-07-03 35 views
3

我使用Python和MySQL,运行下面的查询:那样json.dump蟒蛇的MySQL结果

sSql = "select id from table_name" 
cursor.execute(sSql) 
lrec = self.cursor.fetchall() 
json.dumps(lrec) 

因为我回去长整型符号'id' : 1L而不是'id' : 1

的唯一办法得到一个错误信息解决此问题我发现是丑陋的:

sSql = "select cast(id as char(10)) as id from table_name" 

任何更好的方法呢?

感谢, 克林斯曼

+0

什么是你看l录制打印时是怎样的? – John

+0

你的问题不清楚。你从“fetchall”中“回来”的是一个值,而不是一个记号。该值可以包含longs,被承认。你从“dumps”中“回来”的是一个字符串,因此可以包含像1L这样的符号。这是什么? – Alfe

+0

pp.pprint in first case:'[{'id':1L}]''和'[{'id':'1'}]'second in。首先是当然没有有效的JSON和json.dumps中断。同样在我收到日期的情况下''date_joined':datetime.datetime(2013,7,2,9,18,38)'。理想情况下,我可以告诉json.dumps评估字符串,布尔值和整数以使其有效。 –

回答

1

你可以遍历l录制和所有的id的转换为int。我不知道你的lrec是如何格式化的(即元组列表)。

no_longs = [int(my_id) for my_id in lrec] 
+0

感谢您的回复John,有趣的想法是“按摩”结果;只有当你想使它成为通用的时候,即处理'select *'的时候,你需要识别类型......比我的方法更好。 –

0

感谢johnthexiii的提示,我决定在json.dumping之前简单地修改结果。 然而,我将所有东西都转换为字符串,因为JSON的使用者知道如何处理某些变量,并且只能使用字符串。通过这样做,我也避免了返回例如日期字段的问题。 datetime.datetime(2013, 7, 2, 9, 18, 38)

ltpv = [ tpv for tpv in self.cursor ] 
lk = [ ltpk[ 0 ] for ltpk in self.cursor.description ] 
laResults = [] 
for tpv in ltpv: 
    aResult = {} 
    for k, v in zip(lk, tpv): 
     aResult[ k ] = unicode(v) 
    laResults.append(aResult) 
json.dumps(laResults) 

感谢所有输入