Django:json.dumps打破了JSON数组

Kin*_*gFu 2 python django

我试图在HTML表单中显示JSON文档,分成单独的输入项,允许修改,然后将其转换回JSON文档.

首先,我使用data = json.load(json_data)将doc转换为对象,然后传递data给模板,在模板中访问其属性,如下所示:<input type="hidden" name="countries" value="{{ data.countries }}">.

Once posted back to the view I'm using doc = json.dumps(request.POST) to serialize it back to JSON. This works fine for everything bar arrays: "countries": "[u'US']", which should instead look like: "countries": ['US']

I could use string operations to clean it up, but is there a better way?

view.py (stripped out the DB code)

def addProducts(request):
    if request.POST:
        doc = json.dumps(request.POST)
        return HttpResponseRedirect('/add_product')

    json_data = open('items.json')
    data = json.load(json_data)
    return render("add_products.html", {
        "products": data,
    }, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

doc ends up being a string:

{"doc_type": "Product", "countries": "[u'US']"}
Run Code Online (Sandbox Code Playgroud)

original data in items.json:

 {"doc_type": "Product", "countries": ["US"]}
Run Code Online (Sandbox Code Playgroud)

fre*_*ish 5

行.罪魁祸首就是这条线:

<input type="hidden" name="countries" value="{{ data.countries }}">
Run Code Online (Sandbox Code Playgroud)

在某种程度上,你实际上是在传递str(data.countries)你的模板(隐式),这会产生这些时髦的错误.您必须首先序列化它,然后在您的视图中,您必须再次解析它:

def addProducts(request):
    if request.POST:
        post = {}
        for key in request.POST:
            value = request.POST[key]
            try:
                value = json.loads(value)
            except Exception:
                pass
            post[key] = value
        doc = json.dumps(post)
    # the other code goes here

    return render("add_products.html", {
        "products": data,
    }, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

现在这看起来像是一种矫枉过正,但必须要做,因为它request.POST是一个JSON字符串的字典(你必须手动转换为dict/JSON).

结论:首先在表单中使用JSON值可能不是一个好主意.