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}
这是一个简单的解决方案,希望能给你一些启发。
你没有返回任何内容,只是打印输出。每次你的过滤条件为真时,你都会这样做。
你可以使用 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))
}

