分別介紹golang及Python格式化接口返回JSON數據的方法,及Python json.dumps
方法出現NameError: name 'true' is not defined
原因解析及解決方案介紹。
格式化JSON字符串
我們經常會遇到接口返回的字符串類型的JSON數據,在其中查找數據的時候很不方便,所以一般會選擇將他們格式化,在python中我們通常會使用json.dumps
方法來格式化數據,其實golang中也有類似的方法--json.Indent
,我們一起來看實例。
{"args": {},"headers": {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Connection": "close","Host": "httpbin.org","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"},"origin": "103.*.*.*","url": "http://httpbin.org/get"}
Golang實現
package main
import (
"bytes"
"encoding/json"
"fmt"
)
func main() {
data := `{"args": {},"headers": {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Connection": "close","Host": "httpbin.org","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"},"origin": "103.*.*.*","url": "http://httpbin.org/get"}`
var str bytes.Buffer
_ = json.Indent(&str, []byte(data), "", " ")
fmt.Println("formated: ", str.String())
fmt.Println("data: ", data)
}
實際效果
python實現
參考代碼
import json
data = '{"args": {},"headers": {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Connection": "close","Host": "httpbin.org","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"},"origin": "103.*.*.*","url": "http://httpbin.org/get"}'
print(json.dumps(eval(data), indent=4))
局限
其實上面的的Python實現有一定的局限性,因為在Python當中是不存在true/false/null
這樣的標准json參數的,取而代之的是True/ False/None
,這就回導致一個問題,如果接口返回的數據中含有true/false/null
,直接使用eval
進行轉化會出現比如:NameError: name 'true' is not defined
這樣的錯誤,那么怎么解決呢?
其實答案就是前面的藐視中:true/false/null
是標准的JSON格式,那么我們便先把數據轉化為JSON,再進行格式化即可:
json.dumps(json.loads(data), indent=4, ensure_ascii=False)
解釋:ensure_ascii會保留中文而非轉化為Unicode碼,即\uxxxx
形式
當然,如果大家使用的是requests庫,接口返回的數據中已經攜帶了,可以直接調用其已經為返回結果(Response類)封裝好的的json()方法:
import requests
import json
resp = requests.get("http://httpbin.org/get")
print(json.dumps(resp.json(), indent=4))
其實它最后也是調用的json.loads():
總結
- JSON格式化,ensure_ascii
- resp.json()
- 當然,我們在命令行中也可以格式化Json 標准輸出數據:
curl http://xxx |python -m json.tool