2013-10-09 43 views
0

我刚刚从python 2.5迁移到python 2.7,并用内置的json替换了simplejson。但是现在我得到了一个json错误“JSON.parse:预期的属性名称或'}'。”在迁移到python 2.7之后返回json而不是" 2.7

返回的JSON是:

{ 
    "stat" : "ok", 
    "code" : "200", 
    "message" : "Retrieved departments from account.", 
    "result" : [{"id": "5486563022602240", "name": "The  
    New Establishment"}, {"id": "6049512976023552", 
    "name": "Ye Olde Joynt"}] 
} 

看来我可以做一些字符串在前端(JSON.parse: expected property name or '}')取代,但不应它,而我的服务,它返回正确格式化数据?目前,我产生这样在Python中的数据:

def department_getlist(self): 
    self.message = 'Retrieved departments from account.' 
    results = [] 
    for d in self.account.departments: 
     results.append({ 
     'id': str(d.key().id()), 
     'name': d.name 
     }) 
    self.result = json.dumps(results) 

如何生成在Python中的数据,所以它在正确的格式返回(如果是这样做的方式)?

感谢

托马斯

+1

你确定这是完整的代码生成json?我在顶部返回的json中没有看到任何'id'或'name'键。 – Michael0x2a

+0

@ Michael0x2a你是对的。我更新了返回的json以显示正确的版本。其他json来自应用程序的另一部分 – ThomasD

回答

1

我怀疑是向下行的地方,你打电话json.dumps两次而不是一次。

在你的department_getlist函数中,你做self.result = json.dumps(results)。我猜别的地方,你做的东西的影响:

message = { 
    "stat" : "ok", 
    "code" : "200", 
    "message" : "Retrieved departments from account.", 
    "result" : self.results 
} 

output = json.dumps(message) 

如果是的话,你就self.results变量调用json.dumps两次,逃避在第二次引号。当您的前端JavaScript解析并显示JSON时,它可能会将转义字符串显示为",而不是\"

尝试将department_getlist函数中的行更改为self.result = results并查看是否解决了问题。

+0

@ MichaelOx2a感谢您的建议。这让我做了一个跟踪代码执行的回溯。解决方法是在我的json模板中使用{%autoescape off%}:{“{”status“:”{{status}}“, ”code“:”{{code}}“, ”message“:” {{message}}“{%if result%}, ”result“:{%resultautoescape%} {{result}} {%endautoescape%} {%endif%} – ThomasD

+0

@ThomasD - 啊,我明白了。我想我完全错了:)。您应该考虑将您的解决方案写成新的答案,并接受它,以便将来可能遇到同样问题的其他人受益。 – Michael0x2a

+0

你的答案可能并不完全正确,但你让我走上了正确的道路:-)我添加了一个简短的描述作为答案。再次感谢 – ThomasD

1

多亏了评论通过Michael0x2a搞得我backtraced我的代码,并找到了解决方案是 使用 {%autoescape关闭%}在我的JSON模板:

{ 
    "stat" : "{{ status }}", 
    "code" : "{{ code }}", 
    "message" : "{{ message }}"{% if result %}, 
    "result" : {% autoescape off %}{{ result }}{% endautoescape %}{% endif %} 
}