【发布时间】:2023-04-02 17:03:01
【问题描述】:
在 django 视图中接受嵌套 json 对象的最佳方式是什么?
请求
$.ajax({
type: 'POST',
url: 'results/' + self.id + '/',
contentType:"application/json; charset=utf-8",
data: JSON.stringify(values),
dataType:"json",
...
values 是一个 javascript 字典对象。
Object {Cart: Array[2], Di: "5"}
Cart: Array[2]
0: Object
N: 1
PR: 0.75
__proto__: Object
1: Object
N: "2"
PR: 2.5
__proto__: Object
length: 2
__proto__: Array[0]
Di: "5"
观点
def do_something(request,pid):
print json.loads(request.body)
这是原始帖子数据
{"Cart":["{\"PR\":4,\"N\":1}","{\"PR\":1.2,\"N\":\"2\"}"],"Di":"5"}
问题在于json.loads 将Cart 数组中的内部dicts 保留为unicode 对象。
我尝试过使用jsonpickle 和旧的simplejson,但我得到了相同的结果。
这看起来很基本 - 有没有简单的解决方案?
编辑
阅读您的帖子后,我知道这可能是客户端问题,但我仍然在 ajax 调用中仅对 json 数据进行一次字符串化。
这就是我生成values的方式
基本案例——简单的Dict
self.serialized_value = function() {
if (self.value()) {
var d = {}
d[self.name] = self.value();
return (d);
}
};
对于包含多个参数的对象
self.get_serialized_values = function() {
var values = {};
$.map(self.parameters(), function(p) {
$.extend(values, p.serialized_value());
});
return values;
};
对于包含其他对象的对象
self.serialized_value = function() {
var child_data = [];
$.each(self.items() , function(k,v) {
child_data.push(v.get_serialized_values());
});
var d = {}
d[self.name] = child_data;
return (d);
};
最后,JSON.stringify 仅在 ajax 调用中应用
..
data: JSON.stringify(self.get_serialized_values())
..
json 被字符串化了两次的代码在哪里?
【问题讨论】:
-
json.loads 可以处理嵌套对象,我猜它在客户端没有正确序列化。您确定您在发布对象时调用了 JSON.stringify,并且在序列化整个对象本身之前没有手动序列化其嵌套部分?
-
原始帖子数据正在 JSON 中嵌入 JSON。哎呀!
Cart列表由两个本身需要解码的字符串组成。天上的名字是什么产生了这个? -
我添加了生成购物车的代码。
标签: javascript python django json