gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:22 25 4
gpt4 key购买 nike

我有两个以这种方式构建的 json 输入

"count: 1 result: fields"   

我想在不使用已定义结构的情况下连接我在结果中找到的字段。我尝试了很多方法,但大多数时候结果是关于类型 Interface {} 或最后一个映射覆盖数据的错误

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

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{} 从输入结构的顶部开始,那么您必须对“result”键进行类型断言。例如:

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 结构。以下是如何做到这一点 ( playground link ):

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"}
]
}

关于json - 从 json 合并两个 map[string]interface{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51579246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com