【问题标题】:Problems with Django and Parsing a jsonDjango 和解析 json 的问题
【发布时间】:2013-12-18 21:39:26
【问题描述】:

我正在尝试获取已发布的 json,并将对象导入 django 数据库。
Json 看起来像:

{
"pooledSets" : [
    {
        "name" : "Pooled Set 1",
        "madeBy" : "John Doe",
        "tags" : ['thing1','thing2' ],
        "sets" : [
            {
                "library" : {
                "replicate" : 2,
                "name" : "My library name",
                "referenceGenome" : "hg19-male"
            }
        ]
    },
            {
        "name" : "Pooled Set 1",
        "madeBy" : "John Doe",
        "tags" : ['thing1','thing2' ],
        "sets" : [
            {
                "library" : {
                "replicate" : 2,
                "name" : "My library name",
                "referenceGenome" : "hg19-male"
            }
        ]
    }
]
}

我的代码看起来像:

import json
from django.http import HttpResponse
from piston.handler import BaseHandler
from lab.pooledsets.models import PooledSet
from django.http import QueryDict

class PooledSetJsonHandler(BaseHandler):
    allowed_methods = ('POST')

    def create(self, request):          
        for myPooledSet in request.POST.getlist('pooledSets'):
            myDict = QueryDict(myPooledSet, 'json')
            print myDict
            myName = myDict.__getitem__('name')
            print myName

运行时,myDict 出来就好了:

<QueryDict: {u"{u'name': u'Pooled Set 1', u'tags': [u\'thing1\', u\'thing2\'], u'sets': etc etc etc

但是我得到了错误:

File "/api/pooled_set_post.py", line 17, in create
myName = myDict.__getitem__('name')

File "/Library/Python/2.6/site-packages/django/utils/datastructures.py", line 258, in __getitem__
raise MultiValueDictKeyError("Key %r not found in %r" % (key, self))

发生了什么,如何提取键值对?

【问题讨论】:

  • 顺便说一句,你为什么写myDict.__getitem__('name') 而不是myDict['name']myDict.get('name')
  • 同时,虽然您向我们展示了足够的数据来诊断问题,但您还没有向我们展示足够的数据来修复它。您的输出仅向我们显示了pooledSets 中第一个字典中第一个键的一部分。数据结构显然不应该是由表示 dicts 的 JSON 字符串键入的 dicts 序列……但它应该是什么 就不太明显了。

标签: python django json post request


【解决方案1】:

你的字典不是出来的很好。看看吧:

{u"{u'name': u'Pooled Set 1', u'tags': [u\'thing1\', u\'thing2\'], u'sets': …}

您有一个 dict,其键是表示 dicts 的 JSON 字符串(并且您没有向我们显示其值)。 'name' 不是该字典中的关键; "{u'name': u'Pooled Set 1', u'tags': [u\'thing1\', u\'thing2\'], u'sets': …}" 是。

不知道原始数据是什么,甚至不知道解析后的 myDict 的其余部分是什么样子(您只向我们展示了字典中第一个键的一部分),很难确定您到底应该做什么写而不是你实际写的。

你当然可以这样做:

for key, value in myDict.items():
    actual_dict = json.loads(key) # does the value mean anything?
    print actual_dict['name']

...但是错误地解析数据然后在事后尝试修复它们几乎总是一个坏主意。

【讨论】:

    【解决方案2】:

    您是否考虑过使用固定装置? 鉴于您已经拥有 django 模型正确格式的 json 文件, 你可以运行

    python manage.py loaddata fixture_name.json
    

    它会直接更新你的模型

    参考: https://docs.djangoproject.com/en/dev/howto/initial-data/

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 2018-03-09
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多