Golang中如何根据条件筛选并返回JSON数据

Golang中如何根据条件筛选并返回JSON数据 对于如何根据条件返回值进行筛选,我感到有些困惑。我收到了这个从Grafana请求解析出的响应。如何才能只提取出值大于25的数据?

提前感谢。

{
"ha-external-01":45.804,
"twem-01":20.800243,
"redis-01":20.8902,
"redis-03":20.89015,
"arrango-01":20.8890865
}

期望的结果

{"ha-external-01":45.804}
12 回复

谢谢 🙂

更多关于Golang中如何根据条件筛选并返回JSON数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个简单的解决方案,希望能给你一些启发。

https://play.golang.org/p/5uP1Xuf1rqm

你没有返回任何内容,只是打印输出。每次你的过滤条件为真时,你都会这样做。

你可以使用 return 语句来返回值。

不过,我不太清楚你是想在过滤输入映射后返回映射,还是只返回第一个遇到的值。

https://play.golang.org/p/p_X-ABNkTae

你有拼写错误,不要使用 limit,并且应该处理错误。最终,message 是没问题的。

@ermanimer 的解决方案很好且完整,但我认为如果你的响应 JSON 的键是动态的,解决方案应该是这样的: https://play.golang.org/p/l8KNgQhByo0 我只是修改了 @ermanimer 解决方案中的几行代码。

我不太确定您具体在问什么,但 map[…] 只是一种调试表示形式。它并非被“返回”,您也不需要“不带它”地返回值。

// 代码示例:在Go中,map的默认打印格式类似 map[key:value]
m := map[string]int{"foo": 1}
fmt.Println(m) // 输出: map[foo:1]

感谢您的回复,我的目的是通过SMTP Gmail发送过滤后的值。在消息[]字节内部调用发送函数时,我遇到了一些这样的错误:

	message := []byte("Subject:" + subject + "\n\n" +
		"CPU with the condition over than 80%: " +
		fmt.Sprintf(`{"items":"%v"}`, checklink))

我的错误:

checkURLS(links) used as value
too many arguments to return
        have (string)
        want ()

有什么建议吗?感谢您的帮助。我的完整代码在此处:https://play.golang.org/p/po43WuzhGzC

你好,@shirejoni,抱歉回复晚了。我该如何返回不带 map[] 标记的值呢?例如:

{"ha-external-01":45.804, "redis-b-03":35.3342, "kafka-a-01":47.54754 }

例如,我返回的值是:

map[]
map[redis-b-03:0.323432]
map[docker-a-01:0.652938221 neo-redis-b-03:0.300601]
map[kafka-a-01:0.4754754 docker-a-01:0.6529382 redis-b-03:0.30060120]

抱歉问这么基础的问题 :confused:,我的意思是如何获取像这样的值列表:

[ha-external-a-01:59.48262787184605 php-a-01:68.34888750379501 mysql-b-02:61.23623409094686]

我已经知道使用 append,但它只能逐个追加值:

filtered = make(map[string]float64)
var out []string
for key, value := range response {
	if value > 55 {
		filtered[key] = value
		// fmt.Println(key, value)
		out = append(out, key)
		fmt.Println(out)
	}
}
}

你好 @NobbZ

我的意思是,如何获得像这样的单个返回值,而不是下面的形式:

[ha-external-a-01:59.48262787184605 php-a-01:68.34888750379501 mysql-b-02:61.23623409094686]
map[ha-external-a-01:59.48262787184605]
map[ha-external-a-01:59.48262787184605 php-a-01:68.34888750379501]
map[ha-external-a-01:59.48262787184605 php-a-01:68.34888750379501 mysql-b-02:61.23623409094686]

我基于 @ermanimer 的代码片段:

	filtered = make(map[string]float64)
	for key, value := range response {
		if value > 55 {
			filtered[key] = value
			fmt.Println(filtered)
		}
	}

在Golang中,你可以通过以下方式根据条件筛选JSON数据并返回满足条件的部分:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    // 原始JSON数据
    jsonStr := `{
        "ha-external-01":45.804,
        "twem-01":20.800243,
        "redis-01":20.8902,
        "redis-03":20.89015,
        "arrango-01":20.8890865
    }`

    // 解析JSON到map
    var data map[string]float64
    if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
        panic(err)
    }

    // 筛选值大于25的数据
    filteredData := make(map[string]float64)
    for key, value := range data {
        if value > 25 {
            filteredData[key] = value
        }
    }

    // 将筛选后的数据转换为JSON
    filteredJSON, err := json.Marshal(filteredData)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(filteredJSON))
    // 输出: {"ha-external-01":45.804}
}

如果你需要处理更复杂的JSON结构,可以使用结构体:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `{
        "ha-external-01":45.804,
        "twem-01":20.800243,
        "redis-01":20.8902,
        "redis-03":20.89015,
        "arrango-01":20.8890865
    }`

    var data map[string]float64
    json.Unmarshal([]byte(jsonStr), &data)

    // 使用闭包函数进行筛选
    filterFunc := func(data map[string]float64, threshold float64) map[string]float64 {
        result := make(map[string]float64)
        for k, v := range data {
            if v > threshold {
                result[k] = v
            }
        }
        return result
    }

    filteredData := filterFunc(data, 25)
    
    filteredJSON, _ := json.Marshal(filteredData)
    fmt.Println(string(filteredJSON))
}

对于流式处理或大型JSON数据,可以使用json.Decoder

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `{
        "ha-external-01":45.804,
        "twem-01":20.800243,
        "redis-01":20.8902,
        "redis-03":20.89015,
        "arrango-01":20.8890865
    }`

    decoder := json.NewDecoder(bytes.NewReader([]byte(jsonStr)))
    var data map[string]float64
    decoder.Decode(&data)

    filtered := make(map[string]float64)
    for key, val := range data {
        if val > 25 {
            filtered[key] = val
        }
    }

    output, _ := json.Marshal(filtered)
    fmt.Println(string(output))
}
回到顶部