The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
wangshouh

对部分转义的 JSON 如何进行 unmarshal?

  •  
  •   wangshouh · Jun 29, 2022 · 2785 views
    This topic created in 1595 days ago, the information mentioned may be changed or developed.

    最近写代码请求一个 api ,返回的 json 如下:

    {
        "publisher": "中国人民大学出版社",
        "holdings": "[{\"callNo\":\"F820/49=7\",\"shelfMark\":null,\"itemsCount\":1}]"
    }
    

    我想对holdings进行 unmarshal ,但尝试了一下直接调用函数,出现报错。

    我个人目前的想法是取出holdings,使用strconv.Unquote转义后再 unmarshal ,但感觉比较复杂,请问各位有什么好的办法?

    8 replies  •  2022-07-08 23:12:40 +08:00
    AjiuJiang
    AjiuJiang
    Jun 29, 2022❤️1
    1
    经常用到一个 json 库 github.com/json-iterator/go
    dzdh
    dzdh
    Jun 29, 2022❤️1
    2
    先整个 unmarshal 后取出 string 再 unmarshal
    KasonPasser
    KasonPasser
    Jun 29, 2022
    3
    让写接口的返回一个数组
    reter
    reter
    Jun 29, 2022❤️1
    4
    sun522198558
    sun522198558
    Jun 29, 2022❤️1
    5
    暴力替换

    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(`{
    "publisher": "中国人民大学出版社",
    "holdings": "[{\"callNo\":\"F820/49=7\",\"shelfMark\":null,\"itemsCount\":1}]"
    }`, "\\\"", "\"", -1), "\"[", "[", -1), "]\"", "]", -1)), &s)
    fmt.Println(s)
    wangshouh
    wangshouh
    OP
    Jun 29, 2022
    6
    @reter 使用您的方法解决了问题,非常感谢
    wangshouh
    wangshouh
    OP
    Jun 29, 2022
    7
    @AjiuJiang 测试了一下,这个库不能自动处理转义字符串
    EminemW
    EminemW
    Jul 8, 2022
    8
    @reter #4 这是什么骚操作
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4352 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:58 · PVG 14:58 · LAX 22:58 · JFK 01:58
    ♥ Do have faith in what you're doing.