GVKun编程网logo

无法将JSON解组到结构中(无法将json解组到结构中怎么办)

23

如果您对无法将JSON解组到结构中和无法将json解组到结构中怎么办感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解无法将JSON解组到结构中的各种细节,并对无法将json解组到结构中怎么办进行

如果您对无法将JSON解组到结构中无法将json解组到结构中怎么办感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解无法将JSON解组到结构中的各种细节,并对无法将json解组到结构中怎么办进行深入的分析,此外还有关于go语言之进阶篇json解析到结构体、json解组嵌入式结构、json错误,无法将对象解组为Go值、json错误,无法将对象解组为Go值的实用技巧。

本文目录一览:

无法将JSON解组到结构中(无法将json解组到结构中怎么办)

无法将JSON解组到结构中(无法将json解组到结构中怎么办)

我想将以下JSON解组到结构中:

{"MAIN":{"data":[{"KEY1":"1111111","KEY2":"2222222","KEY3":0,"KEY4":"AAAAAAA","KEY5":"9999","KEY6":"4","KEY7":"BBBBBBB"}]}}

我试图以jsonStruct各种方式修改,但是结构始终为空:

package mainimport (    "encoding/json"    "fmt")type jsonStruct struct {    main struct {        data []struct {            Key1 string `json:"KEY1"`            Key2 string `json:"KEY2"`            Key3 int    `json:"KEY3"`            Key4 string `json:"KEY4"`            Key5 string `json:"KEY5"`            Key6 string `json:"KEY6"`            Key7 string `json:"KEY7"`       } `json:"data"`    } `json:"MAIN"`}func main() {    jsonData := []byte(`{"MAIN":{"data":[{"KEY1":"1111111","KEY2":"2222222","KEY3":0,"KEY4":"AAAAAAA","KEY5":"9999","KEY6":"4","KEY7":"BBBBBBB"}]}}`)    var js jsonStruct    err := json.Unmarshal(jsonData, &js)    if err != nil {            panic(err)    }    fmt.Println(js)}

输出:

{{[]}}

过去使用的JSON没有括号,因此我怀疑问题与它们有关。

有人可以帮忙吗?

https://play.golang.org/p/pymKbOqcM-

答案1

小编典典

发生这种情况是因为其他包(encoding/json)无法访问私有字段(即使具有反射)。在私有语言中,私有字段是以小写字母开头的字段。要解决此问题,请使您的结构包含公共字段(以大写字母开头):

type jsonStruct struct {    Main struct {        Data []struct {            Key1 string `json:"KEY1"`            Key2 string `json:"KEY2"`            Key3 int    `json:"KEY3"`            Key4 string `json:"KEY4"`            Key5 string `json:"KEY5"`            Key6 string `json:"KEY6"`            Key7 string `json:"KEY7"`       } `json:"data"`    } `json:"MAIN"`}

https://play.golang.org/p/lStXAvDtpZ

go语言之进阶篇json解析到结构体

go语言之进阶篇json解析到结构体

1、json解析到结构体

示例:

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct {
	Company  string   `json:"company"`
	Subjects []string `json:"subjects"` //二次编码
	IsOk     bool     `json:"isok"`
	Price    float64  `json:"price"`
}

func main() {

	jsonBuf := `
	{
    "company": "itcast",
    "subjects": [
        "Go",
        "C++",
        "Python",
        "Test"
    ],
    "isok": true,
    "price": 666.666
}`

	var tmp IT                                   //定义一个结构体变量
	err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	//fmt.Println("tmp = ", tmp)
	fmt.Printf("tmp = %+v\n", tmp)
}

执行结果:

tmp = {Company:itcast Subjects:[Go C++ Python Test] IsOk:true Price:666.666}

  

示例2: 定义结构体,解析你想生成的字段

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct {
	Company  string   `json:"company"`
	Subjects []string `json:"subjects"` //二次编码
	IsOk     bool     `json:"isok"`
	Price    float64  `json:"price"`
}

func main() {

	jsonBuf := `
	{
    "company": "itcast",
    "subjects": [
        "Go",
        "C++",
        "Python",
        "Test"
    ],
    "isok": true,
    "price": 666.666
}`

	var tmp IT                                   //定义一个结构体变量
	err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	type IT2 struct {
		Subjects []string `json:"subjects"` //二次编码
	}

	var tmp2 IT2
	err = json.Unmarshal([]byte(jsonBuf), &tmp2) //第二个参数要地址传递
	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	fmt.Printf("tmp2 = %+v\n", tmp2)

}

执行结果:

tmp2 = {Subjects:[Go C++ Python Test]}

  

 

json解组嵌入式结构

json解组嵌入式结构

我想解组结构Outer定义为:

type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

使用json.Unmarshal(data,&Outer{})似乎只对使用InnerUnmarshalJSON,而忽略了Num场:https://play.golang.org/p/WUBfzpheMl

我有一个笨拙的解决方案,我Num可以手动设置该字段,但是我想知道是否有人可以使用一种更清洁或更简单的方法来进行设置。

谢谢!

json错误,无法将对象解组为Go值

json错误,无法将对象解组为Go值

我有这个 JSON数据:

{
"InfoA" : [256,256,20000],"InfoB" : [256,512,15000],"InfoC" : [208,"DEFAULT" : [256,20000]
}

使用JSON-to-Go,我得到了这个Go类型定义:

type AutoGenerated struct {
    InfoA   []int `json:"InfoA"`
    InfoB   []int `json:"InfoB"`
    InfoC   []int `json:"InfoC"`
    DEFAULT []int `json:"DEFAULT"`
}

使用此代码(play.golang.org)

package main

import (
    "encoding/json"
    "fmt"
    "os"
    "strings"
)

func main() {
    type paramsInfo struct {
        InfoA   []int `json:"InfoA"`
        InfoB   []int `json:"InfoB"`
        InfoC   []int `json:"InfoC"`
        DEFAULT []int `json:"DEFAULT"`
    }
    rawJSON := []byte(`{
"InfoA" : [256,20000]
}`)
    var params []paramsInfo
    err := json.Unmarshal(rawJSON,&params)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }
}

我得到错误json:无法将对象解组为类型为[] main.paramsInfo的Go值

我不明白为什么.你能帮助我吗?

解决方法

JSON源是单个对象,但您尝试将其解组为切片.将params的类型更改为paramsInfo(非切片):

var params paramsInfo
err := json.Unmarshal(rawJSON,&params)
if err != nil {
    fmt.Println(err.Error())
    os.Exit(1)
}
fmt.Printf("%+v",params)

然后用输出(在Go Playground上试试):

{InfoA:[256 256 20000] InfoB:[256 512 15000] InfoC:[208 512 20000]
    DEFAULT:[256 256 20000]}

json错误,无法将对象解组为Go值

json错误,无法将对象解组为Go值

我有以下JSON数据:

{"InfoA" : [256,256,20000],"InfoB" : [256,512,15000],"InfoC" : [208,512,20000],"DEFAULT" : [256,256,20000]}

使用JSON-to-Go,我得到以下Go类型定义:

type AutoGenerated struct {    InfoA   []int `json:"InfoA"`    InfoB   []int `json:"InfoB"`    InfoC   []int `json:"InfoC"`    DEFAULT []int `json:"DEFAULT"`}

使用此代码(play.golang.org)

package mainimport (    "encoding/json"    "fmt"    "os"    "strings")func main() {    type paramsInfo struct {        InfoA   []int `json:"InfoA"`        InfoB   []int `json:"InfoB"`        InfoC   []int `json:"InfoC"`        DEFAULT []int `json:"DEFAULT"`    }    rawJSON := []byte(`{"InfoA" : [256,256,20000],"InfoB" : [256,512,15000],"InfoC" : [208,512,20000],"DEFAULT" : [256,256,20000]}`)    var params []paramsInfo    err := json.Unmarshal(rawJSON, &params)    if err != nil {        fmt.Println(err.Error())        os.Exit(1)    }}

我得到错误 json: cannot unmarshal object into Go value of type []main.paramsInfo

我不明白为什么。你能帮助我吗?

答案1

小编典典

JSON源是单个对象,但是您尝试将其解组为切片。将类型更改paramsparamsInfo(非切片):

var params paramsInfoerr := json.Unmarshal(rawJSON, &params)if err != nil {    fmt.Println(err.Error())    os.Exit(1)}fmt.Printf("%+v", params)

然后输出(在Go Playground上尝试):

{InfoA:[256 256 20000] InfoB:[256 512 15000] InfoC:[208 512 20000]    DEFAULT:[256 256 20000]}

关于无法将JSON解组到结构中无法将json解组到结构中怎么办的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于go语言之进阶篇json解析到结构体、json解组嵌入式结构、json错误,无法将对象解组为Go值、json错误,无法将对象解组为Go值等相关知识的信息别忘了在本站进行查找喔。

本文标签: