繁体   English   中英

从json合并两个map [string] interface {}

[英]merge two map[string]interface{} from json

我有两个这样构建的json输入

"count: 1 result: fields"   

我想串联在结果中找到的字段,而无需使用定义的结构。 我已经尝试了很多方法,但是大多数情况下,结果是有关接口{}类型的错误或最后一个映射覆盖了数据

我希望将“结果”以及第一和第二映射字段都合并到输出结果中。

oracle, err := http.Get("http://XXX:8080/XXXX/"+id)
    if err != nil {
            panic(err)
    }
defer oracle.Body.Close()

mysql, err := http.Get("http://XXX:3000/XXX/"+id)
if err != nil {
        panic(err)
}
defer mysql.Body.Close()

oracleJSON, err := ioutil.ReadAll(oracle.Body)
if err != nil {
        panic(err)
}
mysqlJSON, err := ioutil.ReadAll(mysql.Body)
if err != nil {
        panic(err)
}

var oracleOUT map[string]interface{}
var mysqlOUT map[string]interface{}

json.Unmarshal(oracleJSON, &oracleOUT)
json.Unmarshal(mysqlJSON, &mysqlOUT)

a := oracleOUT["result"]
b := mysqlOUT["result"]


c.JSON(http.StatusOK, gin.H{"result": ????})

这是json的一个例子

{"count":1,"result":{"COD_DIPENDENTE":"00060636","MATRICOLA":"60636","COGNOME":"PIPPO"}}

如果我有两个这样的json函数的结果应该是

`"result":{"COD_DIPENDENTE":"00060636","MATRICOLA":"60636","COGNOME":"PIPPO","COD_DIPENDENTE":"00060636","MATRICOLA":"60636","COGNOME":"PIPPO"}}` 

您正在寻找的输出无效的JSON。 但是,只需稍作更改,您就可以输出与示例非常相似的有效JSON。

您可能确实想对输入的具有已知结构的部分使用已定义的结构,以便可以更轻松地提取更抽象的“结果”部分。

如果您使用map[string]interface{}从输入结构的顶部开始,则必须在“结果”键上进行类型声明。 例如:

var input map[string]interface{}

err = json.Unmarshal(data, &input)
if err != nil {
    return err
}
keys, ok := input["result"].(map[string]interface{})
if !ok {
    return errors.New("wasn't the type we expected")
}

但是,如果您为顶层使用了定义的结构,则可以像下面这样进行操作,感觉更加简洁。

type Input struct {
    Count  int                    `json:"count"`
    Result map[string]interface{} `json:"result"`
}

var input Input
err = json.Unmarshal(data, &input)
if err != nil {
    return err
}
// from here you can use input.Result directly without a type assertion

要生成具有重复键的输出,可以使用一个对象数组,每个对象中都有一个键/值对,然后得到一个不会覆盖键的有效JSON结构。 这是这样做的方法( 操场链接 ):

package main

import (
    "encoding/json"
    "fmt"
)

type Input struct {
    Count  int                    `json:"count"`
    Result map[string]interface{} `json:"result"`
}

type Output struct {
    Count  int                      `json:"count"`
    Result []map[string]interface{} `json:"result"`
}

var inputdata = [][]byte{
    []byte(`{"count":1,"result":{"COD_DIPENDENTE":"00060636", "MATRICOLA":"60636", "COGNOME":"PIPPO"}}`),
    []byte(`{"count":1,"result":{"COD_DIPENDENTE":"00060636", "MATRICOLA":"60636", "COGNOME":"PIPPO"}}`),
}

func main() {
    inputs := make([]Input, len(inputdata))
    for i := range inputs {
        err := json.Unmarshal(inputdata[i], &inputs[i])
        if err != nil {
            panic(err)
        }
    }

    var out Output
    out.Count = len(inputs)
    for _, input := range inputs {
        for k, v := range input.Result {
            out.Result = append(out.Result, map[string]interface{}{k: v})
        }
    }

    outdata, _ := json.Marshal(out)
    fmt.Println(string(outdata))
}

格式化后产生的输出看起来像这样:

{
  "count": 2,
  "result": [
    {"MATRICOLA": "60636"},
    {"COGNOME": "PIPPO"},
    {"COD_DIPENDENTE": "00060636"},
    {"COGNOME": "PIPPO"},
    {"COD_DIPENDENTE": "00060636"},
    {"MATRICOLA": "60636"}
  ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM