【问题标题】:Marshal of json.RawMessagejson.RawMessage 的元帅
【发布时间】:2018-12-08 13:40:12
【问题描述】:

请在此处找到代码http://play.golang.org/p/zdQ14ItNBZ

我将 JSON 数据保留为 RawMessage,但无法将其解码。我需要对包含结构进行编组和解组,但我希望仍然能够获取 JSON 字段。

代码:

package main

import (
    "encoding/json"
    "fmt"
)

type Data struct {
    Name string
    Id   int
    Json json.RawMessage
}
type Data2 struct {
    Name string
    Id   int
}


func main() {

    tmp := Data2{"World", 2}

    b, err := json.Marshal(tmp)
    if err != nil {
        fmt.Println("Error %s", err.Error())
    }
    fmt.Println("b %s", string(b))

    test := Data{"Hello", 1, b}
    b2, err := json.Marshal(test)
    if err != nil {
        fmt.Println("Error %s", err.Error())
    }

    fmt.Println("b2 %s", string(b2))

    var d Data
    err = json.Unmarshal(b2, &d)
    if err != nil {
        fmt.Println("Error %s", err.Error())
    }
    fmt.Println("d.Json %s", string(d.Json))

    var tmp2 Data2
    err = json.Unmarshal(d.Json, &tmp2)
    if err != nil {
        fmt.Println("Error %s", err.Error())
    }
    fmt.Println("Data2 %+v", tmp2)

}

输出:

b %s {"Name":"World","Id":2}
b2 %s {"Name":"Hello","Id":1,"Json":"eyJOYW1lIjoiV29ybGQiLCJJZCI6Mn0="}
d.Json %s "eyJOYW1lIjoiV29ybGQiLCJJZCI6Mn0="
Error %s json: cannot unmarshal string into Go value of type main.Data2
Data2 %+v { 0}

【问题讨论】:

    标签: json go


    【解决方案1】:

    json.RawMessage 上的方法都需要一个指针接收器,这就是为什么你不能使用它们中的任何一个;你没有指针。

    从执行的意义上说,这“有效”,但这可能不是您想要的策略:http://play.golang.org/p/jYvh8nHata

    基本上你需要这个:

    type Data struct {
        Name string
        Id   int
        Json *json.RawMessage
    }
    

    然后将该更改传播到程序的其余部分。什么……你到底想做什么?

    【讨论】:

    • 非常感谢。我知道指针接收器,并在本地尝试过。可能犯了一个错误。我使用这个存储一些缓存值,它们只需要作为 http json 响应。再次感谢您的帮助。
    • encoding/xml 包中是否有 json.RawMessage 等价物?
    【解决方案2】:

    对于 1.8 之前的 Go 版本,jorellis 的答案是正确的。

    Go 1.8 及更高版本将正确处理指针和非指针 json.RawMessage 的编组。

    修复提交:https://github.com/golang/go/commit/1625da24106b610f89ff7a67a11581df95f8e234

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多