Golang Go语言中如何对部分转义的 JSON 进行 unmarshal?
最近写代码请求一个 api ,返回的 json 如下:
{
"publisher": "中国人民大学出版社",
"holdings": "[{\"callNo\":\"F820/49=7\",\"shelfMark\":null,\"itemsCount\":1}]"
}
我想对holdings
进行 unmarshal ,但尝试了一下直接调用函数,出现报错。
我个人目前的想法是取出holdings
,使用strconv.Unquote
转义后再 unmarshal ,但感觉比较复杂,请问各位有什么好的办法?
Golang Go语言中如何对部分转义的 JSON 进行 unmarshal?
更多关于Golang Go语言中如何对部分转义的 JSON 进行 unmarshal?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
经常用到一个 json 库 github.com/json-iterator/go
更多关于Golang Go语言中如何对部分转义的 JSON 进行 unmarshal?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
先整个 unmarshal 后取出 string 再 unmarshal
让写接口的返回一个数组
使用您的方法解决了问题,非常感谢
测试了一下,这个库不能自动处理转义字符串
#4 这是什么骚操作
在Go语言中,当你需要对包含部分转义字符的JSON进行unmarshal(反序列化)时,通常面临的问题是JSON格式不正确或未完全转义。标准库encoding/json
期望JSON输入是有效的,否则它会返回一个解析错误。
要处理这种情况,你可以采取以下步骤:
-
预处理JSON字符串:在unmarshal之前,确保JSON字符串是有效格式。这可能包括手动添加缺失的转义字符,或者使用正则表达式等工具来修复字符串。
-
使用第三方库:有些第三方库可能提供了更灵活的解析选项,允许你处理不完全符合标准的JSON。例如,
github.com/tidwall/gjson
或github.com/json-iterator/go
可能提供了更宽松的解析策略。 -
自定义Unmarshal函数:如果JSON格式问题仅限于特定部分,你可以考虑编写自定义的Unmarshal函数,该函数在解析之前先对JSON进行预处理或修正。
-
错误处理:在解析JSON时,始终检查并处理可能发生的错误。这可以帮助你诊断JSON格式问题,并决定是否需要采取进一步行动。
示例代码(预处理JSON字符串):
import (
"encoding/json"
"fmt"
"strings"
)
func main() {
// 假设这是你的部分转义JSON
jsonStr := `{"key": "value with \"unescaped\" quote"}`
// 预处理:添加缺失的转义
fixedJsonStr := strings.ReplaceAll(jsonStr, `"unescaped"`, `\"unescaped\"`)
var result map[string]string
err := json.Unmarshal([]byte(fixedJsonStr), &result)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(result)
}
这种方法适用于简单情况,对于更复杂的JSON,可能需要更复杂的预处理逻辑。