将JSON字符串转换回数组

时间:2015-11-06 06:41:24

标签: python arrays json ajax

我通过ajax将一个浮点值的二维数组传递给我的views.py.我的ajax调用看起来像这样:

$.ajax({
          method: "POST",
          url: "introURL",
          data: {
            csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value,
            dsg_mtx : JSON.stringify(dsg_mtx),

           },
          success: function(data) {

            document.getElementById("test").innerHTML = data;  // echo response
          },
          error: function() {
            alert ("Something went wrong");
          }

我通过此次调用将数据提取到视图中:

def introURL(request):
    if request.is_ajax():
        try:
            designMtx = json.loads(request.POST['dsg_mtx'], parse_float=None)

        except KeyError:
            return HttpResponse('Error, intro import') 

        ... Some transformation of designMtx...


        return HttpResponse(response)       
    else:
        raise Http404   

所以我的问题是如何将这个json stringify' d对象转换回我可以用来计算响应的二维数组?正如您所看到的,我尝试使用parse_float选项,但它仍然是str数据类型。

传递的数组dsg_mtx是使用Handson表创建的,如下所示:

-1  -1
-1  1
1   -1
1   1

感谢您的指导。

2 个答案:

答案 0 :(得分:1)

我的问题原来是handsontable的默认设置。当我为表提供浮点值时,默认情况下,表将它们转换为字符串。所以我发布了一个看起来像浮点数的字符串矩阵。修复只是重新格式化放置数据的双手单元格。

var data = function () {
   return Handsontable.helper.createSpreadsheetData(mtxrows, mtxcols);
  };

  var hot = new Handsontable(container, {
    data: data,
    height: 480,
    colHeaders: true,
    rowHeaders: true,
    stretchH: 'none',
    columnSorting: true,
    contextMenu: true,
    className: "htCenter",
    cells: function (row, col, prop) {
        var cellProperties = {};
        if (row > 0) {
          cellProperties.type = 'numeric';
          cellProperties.format = '0[.]000';
         }                      
        return cellProperties;
        },

    afterChange: function () {
        var tmpData = JSON.parse(JSON.stringify(mtx_data));
    }
  });

所以基本上第一行之后的任何东西都设置为数字类型。

所以现在我的ajax调用中的这一行:

dsg_mtx : JSON.stringify(dsg_mtx),

正确格式化,并且views.py使用此调用正确加载它:

designMtx = json.loads(request.POST['dsg_mtx'])

感谢Tomasz Jakub建议使用console.log()帮助我诊断问题。

此致 海梅

答案 1 :(得分:0)

尝试json.loads但在parse_float传递decimal.Decimal

designMtx = json.loads(request.POST['dsg_mtx'], parse_float=decimal.Decimal)