Python 在GAE/gviz_api上的JSON中浮动

Python 在GAE/gviz_api上的JSON中浮动,python,json,google-app-engine,Python,Json,Google App Engine,我有一个运行在谷歌应用引擎上的python应用程序,它以JSON格式输出数据,该格式由用于谷歌图表可视化的gviz_api构建。代码如下: class StatsItem(ndb.Model): added = ndb.DateTimeProperty(auto_now_add = True, verbose_name = "Upload date") originated = ndb.DateTimeProperty(verbose_name = "Originati

我有一个运行在谷歌应用引擎上的python应用程序,它以JSON格式输出数据,该格式由用于谷歌图表可视化的gviz_api构建。代码如下:

class StatsItem(ndb.Model):
    added      = ndb.DateTimeProperty(auto_now_add = True, verbose_name = "Upload date")
    originated = ndb.DateTimeProperty(verbose_name = "Origination date")
    host       = ndb.StringProperty(verbose_name = "Originating host")
    uptime     = ndb.IntegerProperty(indexed = False, verbose_name = "Uptime")
    load1      = ndb.FloatProperty(indexed = False, verbose_name = "1-min load")
    load5      = ndb.FloatProperty(indexed = False, verbose_name = "5-min load")
    load15     = ndb.FloatProperty(indexed = False, verbose_name = "15-min load")

class ChartDataPage(webapp2.RequestHandler):

    def get(self):
        span = int(self.request.get('span', 720))
        stats = StatsItem.query().order(-StatsItem.originated).fetch(span)

        header = { 'originated' : ("datetime", "date") }

        vars = []
        for v in self.request.get_all('v'):
            if v in StatsItem._properties.keys():
                vars.append(v)
                header[v] = ("number", StatsItem._properties[v]._verbose_name)

        data = []
        for s in stats:
            entry = { 'originated' : s.originated }
            for v in vars:
                entry[v] = getattr(s, v)
            data.append(entry)

        data_table = gviz_api.DataTable(header)
        data_table.LoadData(data)
        self.response.headers['Content-Type'] = 'application/json'
        self.response.out.write(data_table.ToJSonResponse(columns_order=(("originated",) + tuple(vars)),
                                                          order_by="originated"))
它工作正常,但我得到了浮点类型属性的著名问题,即这是我看到的输出(示例):

谷歌.可视化.查询.谷歌.谷歌.可视化.查询..谷歌.谷歌.谷歌.可视化.查询...政府.搜索.谷歌.谷歌.谷歌.谷歌.可视化.查询.查询....政府....回应回应.(.(.(.(.(“状态:::“状态:::“状态:::“状态”:“状态:”ok“状态”ok”,“ok”,“表”和表:::::,[表”行::{“行:{”行:{[[c“““3.3.0.3.3.3.3.3.3亿亿亿亿0.0.0.0.0.0.0.0.0.0.0.3.3.3.3.3亿亿亿亿亿..............0 0 0 0 0 0 0 0 0 0 0 0.....................................}]}{“c:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(2013,11,19,13,3,23518),“:0.4099999999998}],{“c”:[{“v”:“日期(2013,11,19,13,4,23643)”,{“v”:0.40999999999998}],“cols”:[{“类型”:“日期时间”,“id”:“起源”,“标签”:“日期”},{“类型”:“编号”,“id”:“装载5”,“标签”:“5分钟装载”}],“需求id”:“0”,“版本”:“0.6”})

因此,值为0.33(如数据存储查看器中所示)的浮点在JSON中表示为0.3300000000000002。虽然它可以工作,但它不仅丑陋,而且占用带宽,所以我想把它四舍五入到2位数,即0.33。奇怪的是,在某些情况下,这种情况正在发生(见上面的0.25)

我正在从我的应用程序目录加载gviz_api模块

我尝试过以下解决方案,但均无效:

  • round()-在输入数据表之前对图形进行处理(上述代码中的round(getattr(s,v))。它被调用,因为我看到整数变成了浮点数,但对上面的浮点数问题没有影响

  • 既在GAE应用程序模块中,也在gviz_api模块中。没有效果,代码只是没有被调用,就好像根本不存在一样

  • 重写gviz_api.DataTableJSONEncoder中的default()方法。我想这是行不通的,因为它只会被未知的数据类型调用

  • 我还没有尝试处理用regexps生成的JSON字符串,如果可能的话,我希望避免这样做。有没有办法解决这个问题