如今,我试图基于一个公共密钥合并两个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
答案 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
}