python json encode - 缺少(和' - urllib2.open()以HTTP错误400结尾

时间:2013-01-24 08:39:25

标签: python json urllib2

我正在将一个40kb的字典和列表字典编码到json中,然后通过http将其推送到nosql数据库。我已经使用了jsonpickle.encode和json.dumps模块来编码我的字典的内容,但两者都导致了http错误。我尝试手动CURLing有问题的代码部分,结果是错误“-bash:语法错误接近意外令牌”('“

以下是一些示例代码:

import urllib2 , jsonpickle
url = "http://amazonaws.com/server/%s/_create" % item
data = jsonpickle.encode( some_dict_of_dicts_and_lists ) # also tried json.dumps here.
try:
    req = urllib2.Request ( url , data , { 'Content-Type' : 'application/json' } )
    f = urllib2.urlopen ( req )
except Exception as e:
    print "Error: %s" %e

以上工作用于将我的字典的某些部分输入到我的nosql db中。但是,当我发送字典的其他部分时,会打印“错误:HTTP错误400:错误请求”。这对我来说意味着某些东西没有在数据变量/字符串中正确编码。为了获得CURL对此问题的响应,我尝试了CURLing以下代码:

item_id = item_dictionary [ 'id' ]
data = jsonpickle.encode( some_dict_of_dicts_and_lists ) # also tried json.dumps here.

command = 'curl -XPOST "http://amazonaws.com/server/%s/_create" -d '"%s"' % ( nsn_id , data )
os.system(command)

这会产生错误“sh:-c:第0行:意外令牌附近的语法错误”('“

如果我尝试在命令行中手动输入curl命令,我会收到以下错误:
卷曲:(6)无法解析主持人:材料;提供节点名称或服务名称,或未知 卷曲:(6)无法解析主持人:项目;提供节点名称或服务名称,或未知 卷曲:(6)无法解决主持人:提供节点名称或服务名称,或未知 卷曲:(3)[globbing]位于pos 146的无与伦比的紧密支撑/支架 {“error”:“MapperParsingException [无法解析];嵌套:JsonParseException [VALUE_STRING中的意外输入结束\ n在[来源:[B @ 2ff246ab;行:1,列:6519]];”,“状态“:400}

所以:
1)是否有更好的方法来确保json编码过程捕获使得所有括号和单引号都在前面用'\'格式化?我应该替换所有这些吗?

2)是否有一种很好的方法可以使用urllib2以更详细的方式找出此错误的原因,或者我是否需要从命令行执行CURL以获取bash类型错误?

1 个答案:

答案 0 :(得分:0)

回答你的两个问题:

1)json.dumps - 假设您传递了有效输入 - 将始终创建表示有效JSON对象的字符串。如果传递无效输入,则会引发异常。 Python的json模块被广泛使用,如果有一个错误可能导致它吐出一个格式无效的JSON字典,那么现在肯定会知道(并修复)。

2)您收到了HTTPError,因为Web服务器正在返回HTTP Status Code为400的页面以响应您的请求。但是,页面正文中可能还有一些内容,并且urllib2并没有抛弃它。您可以调用HTTPError的.read()方法来获取页面上的任何内容,而不是仅仅看到您当前的状态代码(有时候这不足以理解您做错了什么)。

大多数网络API会在吐出400 - Bad Request错误时向您返回某种有用的解释,例如消息告诉您在请求中错过了哪些参数。将print e.read()放在您的例外块中可以让您看到这一点,并且可能会让您解决当前的问题。