【问题标题】:Receiving nested JSON objects in django在 django 中接收嵌套的 JSON 对象
【发布时间】: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.loadsCart 数组中的内部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


【解决方案1】:

这是客户端的问题。您正在序列化两次:

var x = { PR: 4, N: 1 };
var cart = { Cart: [x] };
JSON.stringify(cart);

不好(产生你的问题)

var x = { PR: 4, N: 1 };
var cart = { Cart: [JSON.stringify(x)] };
JSON.stringify(cart);

【讨论】:

    【解决方案2】:

    您发布的数据包含 双重 编码的 JSON 数据:

    >>> import json
    >>> data = {"Cart":["{\"PR\":4,\"N\":1}","{\"PR\":1.2,\"N\":\"2\"}"],"Di":"5"}
    >>> data['Cart']
    ['{"PR":4,"N":1}', '{"PR":1.2,"N":"2"}']
    >>> data['Cart'][0]
    '{"PR":4,"N":1}'
    >>> json.loads(data['Cart'][0])
    {u'PR': 4, u'N': 1}
    >>> json.loads(data['Cart'][1])
    {u'PR': 1.2, u'N': u'2'}
    

    产生这个结构的任何东西首先对每个Cart 条目进行编码,然后对整个结构进行编码。尽量避免这种情况,因为现在解码需要 两个 步骤。

    在 Python 中,您可以使用以下方法修复此问题:

    def do_something(request,pid):
        data = json.loads(request.body)
        data['Cart'] = [json.loads(d) for d in data['Cart']]
    

    但理想情况下,您应该修复创建嵌套结构的 JS 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 2016-01-22
      • 2019-01-07
      • 1970-01-01
      • 2015-08-23
      • 2021-11-24
      • 2019-08-11
      • 2011-12-09
      相关资源
      最近更新 更多