合并两个带有公共密钥golang的JSON数组

时间:2018-07-30 10:50:43

标签: arrays json go interface

如今,我试图基于一个公共密钥合并两个jon。我输入了两个带有公共字段的不同JSON,我想基于公共密钥合并两个JSON的数据。两种JSON之间存在一种sql连接。

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
    }

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

data.table

如果可以帮助的话,这是我用于在两个单值JSON之间合并的函数,但我无法以正确的方式对其进行修改

library(data.table)
setDT(df_in)[, .(st = min(st), en = max(en)), by = .(cl, idx = rleid(cl))]
#   cl idx                  st                  en
#1:  a   1 2016-01-01 00:35:00 2016-01-01 00:35:59
#2:  c   2 2016-01-01 00:36:00 2016-01-01 00:38:59
#3:  a   3 2016-01-01 00:39:00 2016-01-01 00:44:59
#4:  c   4 2016-01-01 00:45:00 2016-01-01 00:53:59
#5:  a   5 2016-01-01 00:54:00 2016-01-01 00:54:59
#6:  c   6 2016-01-01 00:55:00 2016-01-01 00:55:59
#7:  b   7 2016-01-01 00:56:00 2016-01-01 00:57:59

请帮帮我。 THX

1 个答案:

答案 0 :(得分:1)

这里的一个观察结果是,您可以定义一个简单的类型来对两个数据集进行建模,并利用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)

现在,您的“合并”功能可以简单地返回一个新的“数据”结构,该结构具有从两个输入中填充的值,而不必担心类型断言或强制转换。此实现的主要功能之一是,通过“ 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
}