2

在 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为 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 在代码中的哪个位置被字符串化了两次?

4

2 回答 2

3

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

好的

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);
于 2013-10-25T16:39:53.250 回答
1

您发布的数据包含双重编码的 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 代码。

于 2013-10-25T16:40:00.900 回答