【Golang】格式化JSON字符串,方便查看


分別介紹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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM