You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django传json.dumps结果到前端 JS解析后无法转为字典如何解决

问题根因

后端Inventory.objects.values_list('product_number','amount')返回的是元组列表结构,直接转list序列化后,前端JSON.parse拿到的是二维数组格式[[产品编号, 对应金额], [产品编号, 对应金额]],不是键值对格式的JS对象,自然无法通过data[键名]的方式取值。
你之前调用Object.fromEntries报错、索引访问返回单个字符,是因为操作时误传入了未正确解析的JSON字符串,字符串按位迭代/索引访问时拿到的就是[、数字这类单个字符,不符合fromEntries要求的[key, value] entry结构,就会抛出类型错误。

修复方案

二选一即可,优先选择后端修改方案,链路逻辑更顺畅:

方案1:后端直接输出字典结构(推荐)

修改views.py中的序列化逻辑,把values_list返回的元组列表直接转成Python字典再序列化,前端拿到的就是标准键值对对象,无需额外处理:

# 原有写法
# data1 = Inventory.objects.values_list('product_number','amount')
# data = json.dumps(list(data1), cls=DjangoJSONEncoder)

# 修改后写法
data1 = Inventory.objects.values_list('product_number','amount')
data = json.dumps(dict(data1), cls=DjangoJSONEncoder)

修改后原有前端逻辑不需要调整,data[this.value]就能直接取到对应产品编号的金额值。

方案2:前端转换二维数组为对象

如果不方便调整后端代码,就在前端解析完JSON后,用Object.fromEntries直接把二维数组转成键值对对象,注意不要对解析结果做额外的字符串拆分、逐字符遍历操作:

const rawData = JSON.parse(document.getElementById('hello-data').textContent);
const data = Object.fromEntries(rawData);

document.getElementById('id_line_one').onchange = function(event){
    document.getElementById('id_line_one_unit_price').value = data[this.value];
};

注意:Object.fromEntries的入参必须是解析完成的二维数组,不要传入未解析的JSON字符串,否则就会复现你之前遇到的迭代值非法报错。

内容的提问来源于stack exchange,提问作者perpetualdarkness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:30:48