为了账号安全,请及时绑定邮箱和手机立即绑定

不使用结构时访问 JSON 属性

不使用结构时访问 JSON 属性

C#
慕尼黑的夜晚无繁华 2021-12-06 16:38:56
我有一些 JSON,我需要能够访问这些属性。由于 JSON 属性可能会有所不同,因此我无法创建struct要解组的对象。例子JSON 可能是这样的:{"name" : "John Doe", "email" : "john@doe.com"}或这个:{"town" : "Somewhere", "email" : "john@doe.com"}或其他任何东西。如何访问每个属性?
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您可以将其解组为interface{}. 如果这样做,json.Unmarshal会将 JSON 对象解组为 Go 映射。


例如:


var untypedResult interface{}

err := json.Unmarshal(..., &untypedResult)


result := untypedResult.(map[string]interface{})


// ... now you can iterate over the keys and values of result ...

请参阅 < http://blog.golang.org/json-and-go#TOC_5。> 一个完整的例子。


查看完整回答
反对 回复 2021-12-06
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

如果您碰巧有可能未指定的字段,您可以将输入解组到带有指针的结构中。如果该字段不存在,则指针将为nil。


package main


import (

    "encoding/json"

    "fmt"

)


type Foo struct {

    A *string

    B *string

    C *int

}


func main() {

    var input string = `{"A": "a","C": 3}`

    var foo Foo

    json.Unmarshal([]byte(input), &foo)

    fmt.Printf("%#v\n", foo)

}



如果你真的想要更灵活的东西,你也可以将你的输入解组到map[string]interface{}.


package main


import (

    "encoding/json"

    "fmt"

)


func main() {

    var input string = `{"A": "a","C": 3}`

    var foo map[string]interface{} = make(map[string]interface{})

    json.Unmarshal([]byte(input), &foo)

    fmt.Printf("%#v\n", foo)

}



查看完整回答
反对 回复 2021-12-06
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

解组 JSON 文档时,并非结构中定义的所有属性都需要出现在 JSON 文档中。在您的示例中,您可以定义以下结构:


type MyJson struct {

    Name string `json:"name"`

    Town string `json:"town"`

    Email string `json:"email"`

}

当您使用此结构解组缺少一个或多个这些属性的 JSON 文档时,它们将使用相应类型的 null 值(string属性的空字符串)进行初始化。


或者,您可以使用泛型interface{}类型进行解组,然后使用类型断言。这在博客文章“JSON and GO”中有详细记录:


var jsonDocument interface{}


err := json.Unmarshal(jsonString, &jsonDocument)

map := jsonDocument.(map[string]interface{})

town := map["town"].(string);


查看完整回答
反对 回复 2021-12-06
  • 3 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信