8

ここでコードを見つけてください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}
4

2 に答える 2

15

json.RawMessage のメソッドはすべてポインター レシーバーを使用するため、それらのいずれも利用できません。あなたはポインタを持っていません。

これは実行するという意味で「機能」しますが、これはおそらくあなたが望む戦略ではありません: http://play.golang.org/p/jYvh8nHata

基本的にこれが必要です:

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

そして、その変更をプログラムの残りの部分に伝播します。なに…何をしようとしているの?

于 2013-10-02T19:37:36.863 に答える