2013-10-09 87 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 %} 
}