从map [string] interface {}插入JSON或地图到MongoDB集合会设置整数并以字符串形式浮起

时间:2019-02-18 13:31:11

标签: json go maps mgo

我知道标题似乎是通用名称和重复名称,但我已经尝试了前面问题中的许多选项,并且我不能在此处使用结构

我的系统正在使用消息传递服务NATS在订阅者和发布者之间发送地图。订阅者获取接收到的地图,并将其作为文档插入到MongoDB集合中

我的问题是浮点数和整数作为字符串插入!

在我的代码中, recipe 是一个配置文件,用于设置映射中接收到的列的数据类型。可以将其视为一系列这样的键:

  • 字符串列:“字符串”,
  • 诠释栏:“ int”

以下是使用正确的数据类型创建地图的代码

mapWithCorrectDataTypes := make(map[string]interface{})

    for columnNameFromDataTypesInRecipe, datatypeForColumnInRecipe := range dataTypesFromRecipeForColumns {

    for natsMessageColumn, natsMessageColumnValue := range mapFromNATSMessage {

            //If the column in the NATS message is found in the recipe, format the data as dictated in the recipe
                    if natsMessageColumn == columnNameFromDataTypesInRecipe {

                        if datatypeForColumnInRecipe.(string) == "string" {

                            natsMessageColumnValue = natsMessageColumnValue.(string)
                            mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe] = natsMessageColumnValue
                        }

                        if datatypeForColumnInRecipe.(string) == "int" {

                            convertedInt, err := strconv.Atoi(mapFromNATSMessage[columnNameFromDataTypesInRecipe].(string))
                            if err != nil {
                                fmt.Println("ERROR -->", err)
                            }
                            mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe] = convertedInt
                        }

                        if datatypeForColumnInRecipe.(string) == "float64" {

                            convertedFloat, err := strconv.ParseFloat(mapFromNATSMessage[columnNameFromDataTypesInRecipe].(string), 64)

                            if err != nil {
                                fmt.Println("ERROR -->", err)
                            }
                            mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe] = convertedFloat

                            fmt.Println("TYPE -->", reflect.TypeOf(mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe]))
                        }
                    } else {
                        //If column not found in the recipe, format as a string
                        mapWithCorrectDataTypes[natsMessageColumn] = natsMessageColumnValue.(string)
                    }
                }
            }

从最后一行开始,我为float64s插入了一条打印语句,以检查映射中此键的数据类型是否正确,并通过了此测试!


我的问题是:如果在地图中正确设置了数据类型,为什么将地图作为MongoDB中的文档插入时将浮点数和整数设置为字符串?!

到目前为止,我已经尝试过:

将地图编组和解组为接口,然后插入记录:

        jsonVersionOfMap, err := json.Marshal(mapWithCorrectDataTypes)

        if err != nil {
            fmt.Println("ERROR -->", err)
        }

        var interfaceForJSON interface{}

        json.Unmarshal(jsonVersionOfMap, &interfaceForJSON)

        fmt.Println("JSON -->", interfaceForJSON)
        err = mongoConnection.Insert(interfaceForJSON)

        if err != nil {
            fmt.Println("Error inserting MongoDB documents", err)
        }

我在这里想念什么?

查看格式错误的数据的结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

这可能不是解决方法。但是我已经解决了我遇到的问题。我正在通过NATS使用发布者和订阅者。以前,我是用所有数据创建一个地图,然后将其作为消息发送出去,然后订户从消息中获取该图,并处理数据类型(在订户端)

为解决我遇到的问题,我改为在发布者一侧设置了地图的值格式。因此,我将检查数据类型的代码移到了NATS发布者上,而不是将处理传入消息的代码移到了

我知道这不是理想的解决方案,但是如果您使用的是NATS,但发现同样的问题。试试这个