当前位置: 首页 > 知识库问答 >
问题:

用一些已知和一些未知的字段名解组JSON

颛孙智勇
2023-03-14

我有以下 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.
}

我该怎么做?

共有3个答案

毕宏盛
2023-03-14

最简单的方法是使用这样的界面:

var f interface{}
s := `{"a":1, "b":2, "x":1, "y":1}`

if err := json.Unmarshal([]byte(s), &f); err != nil {
    panic(err)
}

去游乐场示例

何涵忍
2023-03-14

这并不好,但你可以通过实现 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类型对于避免解码时的递归是必要的。

杨昆
2023-03-14

一种选择是取消封送两次:一次解组为 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. AFo. 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个保留在字段中的类型。这些孩子最终成为我的问题类型。我如何才能解决嵌套数据的问题?这