Golang Go语言中如何对部分转义的 JSON 进行 unmarshal?

发布于 1周前 作者 phonegap100 来自 Go语言

最近写代码请求一个 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

9 回复

经常用到一个 json 库 github.com/json-iterator/go

更多关于Golang Go语言中如何对部分转义的 JSON 进行 unmarshal?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


先整个 unmarshal 后取出 string 再 unmarshal

让写接口的返回一个数组

暴力替换

type S struct {
Publisher string json:"publisher"
Holdings []struct {
CallNo string json:"callNo"
ShelfMark interface{} json:"shelfMark"
ItemsCount int json:"itemsCount"
} json:"holdings"
}
var s S
_ = json.Unmarshal([]byte(strings.Replace(strings.Replace(strings.Replace({<br> "publisher": "中国人民大学出版社",<br> "holdings": "[{\"callNo\":\"F820/49=7\",\"shelfMark\":null,\"itemsCount\":1}]"<br>}, “\”", “”", -1), “”[", “[”, -1), “]”", “]”, -1)), &s)
fmt.Println(s)

使用您的方法解决了问题,非常感谢

测试了一下,这个库不能自动处理转义字符串

#4 这是什么骚操作

在Go语言中,当你需要对包含部分转义字符的JSON进行unmarshal(反序列化)时,通常面临的问题是JSON格式不正确或未完全转义。标准库encoding/json期望JSON输入是有效的,否则它会返回一个解析错误。

要处理这种情况,你可以采取以下步骤:

  1. 预处理JSON字符串:在unmarshal之前,确保JSON字符串是有效格式。这可能包括手动添加缺失的转义字符,或者使用正则表达式等工具来修复字符串。

  2. 使用第三方库:有些第三方库可能提供了更灵活的解析选项,允许你处理不完全符合标准的JSON。例如,github.com/tidwall/gjsongithub.com/json-iterator/go可能提供了更宽松的解析策略。

  3. 自定义Unmarshal函数:如果JSON格式问题仅限于特定部分,你可以考虑编写自定义的Unmarshal函数,该函数在解析之前先对JSON进行预处理或修正。

  4. 错误处理:在解析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,可能需要更复杂的预处理逻辑。

回到顶部