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

如何处理文档中不一致的json字段,json,mongodb,go,Json,Mongodb,Go,我目前有一个很大的JSON文件,它必须存储在后端(mongodb&Go),并在前端使用。我想知道文档的第三个字段是否应该类似于“子类别”,而不是第二个字段中的运动名称,或者这是否可能,因为我认为这可能很难在后端语言中建模和反序列化,因为不一致 样本: { "_id" : ObjectId("55c"), "Sport" : "Athletics ", "Athletics" : { ["Men's Individual", "Women's Individual", "Mix

我目前有一个很大的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"]
  }
}
您可以使用以下方法完成此操作:


我同意这个小声音告诉你要使用“子类别”,而不是试图处理不一致的类型。此外,你应该将游泳中的“男性”和“女性”子类别结合起来,就像你在网球和田径中所做的那样。这将让您更好地利用encoding/json(和mgo/bson)的映射特性,但我不会将其称为“后端语言”问题——一致的数据类型也会使您的js(和其他客户端代码)更好

根据jsonlint,json是无效的。应该是{“_id”:ObjectId(“55c”),“Sport”:“Athletics”,“Athletics”:[“男单”、“女单”、“混合接力”]}如何创建json。生成文档的是另一个应用程序吗?不回答您的问题,但可能会有所帮助
package main

import (
    "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)
    }
}