Сериализация данных Python (Django) в JavaScript

Я пытаюсь вернуть данные в javascript, используя json.dumps, чтобы показать данные пользователю.

Вызов Dajax при нажатии кнопки:Dajaxice.chamber.ATableUpdate(TableUpdate);

Моя функция ajax:

@dajaxice_register
def ATableUpdate(request):
    mean = [[900, 2.1],[1000, -20.4],[1100, -15.4],[1200, -30.5]]
    numpy.savetxt("table_mean.txt", mean)
    mean2 = numpy.loadtxt("table_mean.txt")
    return json.dumps({"mean": mean})

Если я возвращаю значение mean, как показано, все это работает, но если вместо этого я возвращаю mean2 (те же значения, считанные из файла с numpy), оно не работает и выдает ошибку: "Не сериализуемо JSON"

Код просто извлекает данные из файла и показывает данные пользователю в виде таблицы. Файл обновляется значениями датчиков, подключенных к системе.

Любые идеи о том, как сериализовать мои данные? Или как вернуть массив в мой HTML без использования JavaScript и только с использованием шаблона Djangos?

HTML-класс для печати таблицы

<div class="box_result_inner">
<table cellspacing="0px" cellpadding="1px" border="1px" id="tablehtml">
</table>  
</div>

Javascript

function TableUpdate(data){
    var col=data.mean[0].length;
    var row=data.mean.length;
    buffer='';
    for(var r = 0; r < row; r++){
        buffer += "<tr>";
        for(var c = 0; c < col ; c++){
            buffer += "<td>" + data.mean[r][c] + "</td>";
        }
        buffer += "</tr>";
    }
    document.getElementById("tablehtml").innerHTML = buffer;
 }

Обновление К сожалению, список не работал для меня, так как он добавлял массив перед каждой строкой, однако заставил его работать с:

with open("chamber/control/data/table_mean.txt", 'wb') as fp:
    json.dump(mean, fp)

with open("chamber/control/data/table_mean.txt", 'rb') as fp:
    mean2 = json.load(fp)

return json.dumps({"mean": mean2})

1 ответ

Решение

Модуль Python JSON может обрабатывать только определенные родные типы Python, перечисленные здесь.

numpy.loadtxt функция возвращает array типа и так не сериализуемо.

Вместо этого преобразуйте array к list, а затем преобразовать в JSON:

mean2 = list(numpy.loadtxt("table_mean.txt"))
return json.dumps({"mean": mean})

Эта операция может быть дорогой в зависимости от размера numpy массив.

Другие вопросы по тегам