Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 用一个公共密钥golang合并两个JSON数组_Arrays_Json_Go_Interface - Fatal编程技术网

Arrays 用一个公共密钥golang合并两个JSON数组

Arrays 用一个公共密钥golang合并两个JSON数组,arrays,json,go,interface,Arrays,Json,Go,Interface,这几天,我试图合并两个乔恩基于一个共同的关键。我在一个公共字段中输入了两个不同的json,我想基于公共键合并这两个json的数据。两个JSON之间的一种sql连接 JSON源于此代码 func Dati_plus(c *gin.Context) { oracle, err := http.Get("http://XXXX/XXX") if err != nil { panic(err) } defer oracle.Body.Close() mysql

这几天,我试图合并两个乔恩基于一个共同的关键。我在一个公共字段中输入了两个不同的json,我想基于公共键合并这两个json的数据。两个JSON之间的一种sql连接

JSON源于此代码

func Dati_plus(c *gin.Context) {

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

mysql, err := http.Get("http://XXXX/XXX")
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([]byte(oracleJSON), &oracleOUT)
json.Unmarshal([]byte(mysqlJSON), &mysqlOUT)

a := map[string]interface{}{"result":mysqlOUT["result"]}
b := map[string]interface{}{"result":oracleOUT["result"]}
输入中的JSON具有以下形式

{"count":2,"result":[{"DESC":"2","NOMEmy":"PIPPO","COGNOMEmy":"PIPPO"},{"DESC":"7","NOMEmy":"PIPPO","COGNOMEmy":"PIPPO"}]

{"count":2,"result":[{"DESC":"2","COS":"PIPPO","ROS":"PIPPO"},{"DESC":"7","COS":"PIPPO","ROS":"PIPPO"},{"DESC":"60","COS":"PIPPO","ROS":"PIPPO"}]
如果我有两个类似这样的json,那么函数的结果应该是

{"count":2,"result":[{"DESC":"2","COS":"PIPPO","ROS":"PIPPO","NOMEmy":"PIPPO","COGNOMEmy":"PIPPO"},{"DESC":"7","COS":"PIPPO","ROS":"PIPPO","NOMEmy":"PIPPO","COGNOMEmy":"PIPPO"},{"DESC":"60","COS":"PIPPO","ROS":"PIPPO"}]
如果有帮助的话,这是一个我用来在两个单值JSON之间合并的函数,但是我不能以正确的方式修改它

    func merge(dst, src map[string]interface{}, depth int) map[string]interface{} {
    if depth > MaxDepth {
        panic("Troppo Lungo")
    }
    for key, srcVal := range src {
        if dstVal, ok := dst[key]; ok {
            srcMap, srcMapOk := mapify(srcVal)
            dstMap, dstMapOk := mapify(dstVal)
            if srcMapOk && dstMapOk {
                srcVal = merge(dstMap, srcMap, depth+1)
            }
        }
        dst[key] = srcVal
    }
    return dst
}

    func mapify(i interface{}) (map[string]interface{}, bool) {
        value := reflect.ValueOf(i)
        if value.Kind() == reflect.Map {
            m := map[string]interface{}{}
            for _, k := range value.MapKeys() {
                m[k.String()] = value.MapIndex(k).Interface()
            }
            return m, true
        }
        return map[string]interface{}{}, false
    }

请帮帮我。THX

这里的一个观察是,您可以定义一个简单的类型,对两个数据集进行建模,并使用golang类型系统来发挥您的优势(而不是使用如此多的反射来对抗它),例如:

type Data struct {
  Count   int                 `json:"count"`
  Results []map[string]string `json:"result"`
}

// ...
oracleData, mysqlData := Data{}, Data{}
err := json.Unmarshal([]byte(oracleJson), &oracleData)
check(err)
err := json.Unmarshal([]byte(mysqlJson), &mysqlData)
check(err)
现在,您的“merge”函数可以简单地返回一个新的“Data”结构,其中包含从两个输入填充的值,而不必担心类型断言或强制转换。此实现的一个关键特性是,它通过数据结果对象的“DESC”键创建数据结果对象的查找表,该键稍后用于关联:

func merge(d1, d2 Data) Data {
  // Create the lookup table by each result object "DESC".
  d1ResultsByDesc := map[string]map[string]string{}
  for _, obj1 := range d1.Results {
    d1ResultsByDesc[obj1["DESC"]] = obj1
  }

  newData := Data{}
  for _, obj2 := range d2.Results {
    newObj := map[string]string{}
    // Include all result data objects from d2
    for k2, v2 := range obj2 {
      newObj[k2] = v2
    }
    // Also include the matching result data from d1
    obj1 := d1ResultsByDesc[obj2["DESC"]]
    for k1, v1 := range obj1 {
      newObj[k1] = v1
    }
    newData.Results = append(newData.Results, newObj)
  }

  return newData
}

这里的一个观察结果是,您可以定义一个简单的类型,该类型将对两个数据集进行建模,并使用golang类型系统为您带来好处(而不是使用这么多反射来对抗它),例如:

type Data struct {
  Count   int                 `json:"count"`
  Results []map[string]string `json:"result"`
}

// ...
oracleData, mysqlData := Data{}, Data{}
err := json.Unmarshal([]byte(oracleJson), &oracleData)
check(err)
err := json.Unmarshal([]byte(mysqlJson), &mysqlData)
check(err)
现在,您的“merge”函数可以简单地返回一个新的“Data”结构,其中包含从两个输入填充的值,而不必担心类型断言或强制转换。此实现的一个关键特性是,它通过数据结果对象的“DESC”键创建数据结果对象的查找表,该键稍后用于关联:

func merge(d1, d2 Data) Data {
  // Create the lookup table by each result object "DESC".
  d1ResultsByDesc := map[string]map[string]string{}
  for _, obj1 := range d1.Results {
    d1ResultsByDesc[obj1["DESC"]] = obj1
  }

  newData := Data{}
  for _, obj2 := range d2.Results {
    newObj := map[string]string{}
    // Include all result data objects from d2
    for k2, v2 := range obj2 {
      newObj[k2] = v2
    }
    // Also include the matching result data from d1
    obj1 := d1ResultsByDesc[obj2["DESC"]]
    for k1, v1 := range obj1 {
      newObj[k1] = v1
    }
    newData.Results = append(newData.Results, newObj)
  }

  return newData
}

为什么在这里投票?这个问题似乎措辞得当,包括代码和示例数据,而且似乎适合这个社区……我不知道。Thx支持男士为什么在这里投反对票?这个问题似乎措辞得当,包括代码和示例数据,而且似乎适合这个社区……我不知道。Thx为支持人员我只需一点零钱就得到了我想要的。。谢谢你,只要一点零钱我就得到了我想要的。。谢谢