首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用更改JSON属性解除封送

使用更改JSON属性解除封送
EN

Stack Overflow用户
提问于 2018-06-24 03:37:18
回答 2查看 820关注 0票数 0

我有一个JSON对象,它的细节可以包含不同类型的JSON对象,其余的JSON保持不变,在这种情况下,如何在Golang中有一个单独的结构来处理这两种类型的JSON

JSON 1:

代码语言:javascript
复制
{
   "field1":"",
   "field2":"",
   "field3":"",
   "field4":"",
   "field5":"",
   "field6":"",
   "field7":"",
   "details":{
      "detail1":"",
      "detail2":[
         {
            "arr1":"",
            "arr2":{
               "id":"",
               "name":""
            },
            "list":[
               {
                  "id":"",
                  "version":1,
                  "name":""
               }
            ]
         }
      ]
   },
   "user":{
      "id":"",
      "name":""
   }
}

JSON 2:

代码语言:javascript
复制
{
   "field1":"",
   "field2":"",
   "field3":"",
   "field4":"",
   "field5":"",
   "field6":"",
   "field7":"",
   "details":{
      "anotherdetail1":"",
      "anotherdetail2":[
         {
            "arr7":"",
            "arr8":{
               "id":"",
               "name":""
            },
            "arr10":{

            }
         }
      ]
   },
   "user":{
      "id":"",
      "name":""
   }
}

我的目标是为这两个JSON对象使用一个结构。在像Java这样的语言中,我会创建一个父类,它在一般方式上类似于细节,并且有两个子类来类似于不同的细节类型,而在运行时,我将创建一个子类型的对象并将其分配给父类。我不知道这是怎么做的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-24 05:47:05

我不确定您是否可以有一个结构,除非您可以使用字符串接口映射,但您可以通过将其设置为json.RawMessage类型的interface来防止详细信息被解码。然后,您可以尝试将未知类型的json数据解码为一种类型,如果返回错误,则尝试使用下一种类型。

这是一些代码,这应该给你一个更好的想法,我说的。

https://play.golang.org/p/06owmiJXNaO

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
)

const json1 = `{"name": "foo", "details":[1, 2, 3]}`
const json2 = `{"name": "foo", "details":{"a": [1, 2, 3]}}`

type data struct {
    Name    string          `json:"name"`
    Details json.RawMessage `json:"details"`
}

type detailsone []int

type detailstwo struct {
    A []int `json:"a"`
}

func main() {
    var d1, d2 data
    json.Unmarshal([]byte(json1), &d1)
    json.Unmarshal([]byte(json2), &d2)

    fmt.Printf("%+v\n", d1)
    fmt.Printf("%+v\n", d2)

    var err error
    var b1 detailsone
    var b2 detailstwo

    // json1
    err = json.Unmarshal([]byte(d1.Details), &b1)
    if err == nil {
        fmt.Printf("d1 is an []int: %+v\n", b1)
    }
    err = json.Unmarshal([]byte(d1.Details), &b2)
    if err == nil {
        fmt.Printf("d1 is an detailstwo struct: %+v\n", b2)
    }

    // json2
    err = json.Unmarshal([]byte(d2.Details), &b1)
    if err == nil {
        fmt.Printf("d2 is an []int: %+v\n", b1)
    }
    err = json.Unmarshal([]byte(d2.Details), &b2)
    if err == nil {
        fmt.Printf("d2 is an detailstwo struct: %+v\n", b2)
    }
}
票数 3
EN

Stack Overflow用户

发布于 2018-06-24 06:26:50

代码语言:javascript
复制
type Base struct {
    Data map[string]interface{}

    Details struct {
        *D1
        *D2
    } `json:"details"
}

type D1 struct {
    Detail1 string
    Detail2 string
}

type D2 struct {
    AnotherDetail1 string
    AnotherDetail2 string
}

通过将它们与nil进行比较,可以找到已填充的结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51006751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档