我有以下 JSON
{"a":1, "b":2, "?":1, "??":1}
我知道它有“a”和“b”字段,但我不知道其他字段的名称。所以我想以以下类型散集它:
type Foo struct {
// Known fields
A int `json:"a"`
B int `json:"b"`
// Unknown fields
X map[string]interface{} `json:???` // Rest of the fields should go here.
}
我该怎么做?
最简单的方法是使用这样的界面:
var f interface{}
s := `{"a":1, "b":2, "x":1, "y":1}`
if err := json.Unmarshal([]byte(s), &f); err != nil {
panic(err)
}
去游乐场示例
这并不好,但你可以通过实现 Unmarshaler
来实现它:
type _Foo Foo
func (f *Foo) UnmarshalJSON(bs []byte) (err error) {
foo := _Foo{}
if err = json.Unmarshal(bs, &foo); err == nil {
*f = Foo(foo)
}
m := make(map[string]interface{})
if err = json.Unmarshal(bs, &m); err == nil {
delete(m, "a")
delete(m, "b")
f.X = m
}
return err
}
_Foo
类型对于避免解码时的递归是必要的。
一种选择是取消封送两次:一次解组为 Foo
类型的值,一次解组为 map[string]interface{}
类型的值,并删除键“a
”和“b”
:
type Foo struct {
A int `json:"a"`
B int `json:"b"`
X map[string]interface{} `json:"-"` // Rest of the fields should go here.
}
func main() {
s := `{"a":1, "b":2, "x":1, "y":1}`
f := Foo{}
if err := json.Unmarshal([]byte(s), &f); err != nil {
panic(err)
}
if err := json.Unmarshal([]byte(s), &f.X); err != nil {
panic(err)
}
delete(f.X, "a")
delete(f.X, "b")
fmt.Printf("%+v", f)
}
输出(在Go Playground上尝试):
{A:1 B:2 X:map[x:1 y:1]}
另一种选择是散集一次到map[string]接口{}
并手动处理Fo. A
和Fo. B
字段:
type Foo struct {
A int `json:"a"`
B int `json:"b"`
X map[string]interface{} `json:"-"` // Rest of the fields should go here.
}
func main() {
s := `{"a":1, "b":2, "x":1, "y":1}`
f := Foo{}
if err := json.Unmarshal([]byte(s), &f.X); err != nil {
panic(err)
}
if n, ok := f.X["a"].(float64); ok {
f.A = int(n)
}
if n, ok := f.X["b"].(float64); ok {
f.B = int(n)
}
delete(f.X, "a")
delete(f.X, "b")
fmt.Printf("%+v", f)
}
输出相同(Go Playground):
{A:1 B:2 X:map[x:1 y:1]}
我在laravel 5中工作,我有一个模块,用户可以在其中更新学生的信息,因为用户有一个带有当前数据的预加载表单,并且可以修改他想要的字段。然后,在控制器中,我执行以下操作: 那工作得很好。所以我的问题是:有一种方法可以获得已经更新的字段的名称?
问题内容: 是否可以解组未知字段的JSON?该字段名称始终是不同的,但是结构是相同的。JSON是POST请求的结果。 我的代码: 问题答案: 如果您不知道键,只需使用一个映射,并且映射的值类型可能是描述该结构的结构: 请注意,您必须导出字段才能使用此功能! 和解编代码: 输出(在Go Playground 上尝试):
隐藏盒子的几种方式 隐藏盒子,有以下几种方式: (1)方式一: overflow:hidden; //隐藏盒子超出的部分 (2)方式二: display: none; 隐藏盒子,而且不占位置(用的最多) 比如,点击X,关闭京东首页上方的广告栏。 (3)方式三: visibility: hidden; //隐藏盒子,占位置。 visibility: visible; //让盒子重新
本文向大家介绍简单了解python PEP的一些知识,包括了简单了解python PEP的一些知识的使用技巧和注意事项,需要的朋友参考一下 前言 或许你是一个初入门Python的小白,完全不知道PEP是什么。又或许你是个学会了Python的熟手,见过几个PEP,却不知道这玩意背后是什么。那正好,本文将系统性地介绍一下PEP,与大家一起加深对PEP的了解。 目前,国内各类教程不可胜数,虽然或多或少会
我在跟踪http://spark.apache.org/docs/latest/sql-programming-guide.html 打字后: 我有一些我没有看到答案的问题。 首先,什么是$符号?如 第二,我能从第二行得到数据吗(我不知道第二行的数据是什么)。 第三,你将如何阅读彩色图像与火花sql? 第四,我仍然不确定数据集和火花中的数据帧有什么区别。变量df是一个数据帧,所以我可以将“Mich
问题内容: 我在这里分叉了一个很棒的项目,并且刚刚学习了一些东西,就把它弄乱了。我不知道的问题是有关自定义编组的一些问题,如果您在这里看到,您可以看到它解组了包含一个字段的结构,然后使用该字段将其解组。除了嵌套的情况,这一切都很好。因此,最好的例子是: 只需说您有一个善意的结构是a ,那么就可以将其编组。然后具有3个保留在字段中的类型。这些孩子最终成为我的问题类型。我如何才能解决嵌套数据的问题?这