如何处理文档中不一致的json字段

我目前有一个大型 JSON 文件,它必须存储在后端(mongodb & Go)中并在前端使用。我想知道文档的第三个字段是否应该类似于“子类别”而不是第二个字段中的运动名称,或者这是否可能,因为我认为这可能由于不一致而难以在后端语言中建模和反序列化?


样本:


{

  "_id" : ObjectId("55c"),

  "Sport" : "Athletics ",

  "Athletics" : {

    ["Men's Individual", "Women's Individual", "Mixed Relay"]

   }

}


{

  "_id" : ObjectId("56c"),

  "Sport" : "Tennis",

  "Tennis" : ["Men's singles", "Women's singles", "Men's doubles", "Women's doubles", "Mixed doubles"]

}


{

  "_id" : ObjectId("57c"),

  "Sport" : "Swimming",

  "Swimming" : {

    "Men" : ["4×100 m relay", "4×200 m freestyle relay"],

    "Women" : ["4×100 m relay", "4×200 m freestyle relay"]

  }

}


素胚勾勒不出你
浏览 197回答 2
2回答

动漫人物

我同意小声音告诉您使用“子类别”而不是尝试处理不一致的类型。此外,您应该结合游泳中的“男子”和“女子”子类别,类似于在网球和田径中的做法。这将使您更好地利用 encoding/json(和 mgo/bson 的)映射功能,但我不会称其为“后端语言”问题 - 一致的数据类型也应该使您的 js(和其他客户端代码)更好!

犯罪嫌疑人X

你可以使用json.RawMessage:package mainimport (    "encoding/json"    "fmt"    "log")func main() {    type Color struct {        Space string        Point json.RawMessage // delay parsing until we know the color space    }    type RGB struct {        R uint8        G uint8        B uint8    }    type YCbCr struct {        Y  uint8        Cb int8        Cr int8    }    var j = []byte(`[        {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}},        {"Space": "RGB",   "Point": {"R": 98, "G": 218, "B": 255}}    ]`)    var colors []Color    err := json.Unmarshal(j, &colors)    if err != nil {        log.Fatalln("error:", err)    }    for _, c := range colors {        var dst interface{}        switch c.Space {        case "RGB":            dst = new(RGB)        case "YCbCr":            dst = new(YCbCr)        }        err := json.Unmarshal(c.Point, dst)        if err != nil {            log.Fatalln("error:", err)        }        fmt.Println(c.Space, dst)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go