草庐IT

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

coder 2024-07-09 原文

我有两个以这种方式构建的 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/

有关json - 从 json 合并两个 map[string]interface{}的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  4. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  5. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  6. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  7. ruby - 从 String#split 返回的零长度字符串 - 2

    在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

  8. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  9. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  10. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

随机推荐