英文:
How to check if JSON is contain in an array JSON objects in golang
问题
我有一个JSON对象数组,结构如下:
结构体:
type Data struct {
TaiList []Tai `json:"taiList"`
}
type Tai struct {
PlmnId *PlmnId `json:"plmnId"`
Tac string `json:"tac"`
Nid string `json:"nid"`
}
type PlmnId struct {
Mcc string `json:"mcc"`
Mnc string `json:"mnc"`
}
在MongoDB中的JSON格式如下:
[
{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "99"
},
{
"plmnId": {
"mcc": "244",
"mnc": "34"
},
"tac": "00001",
"nid": "555"
}
]
},
{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "99"
}
]
}
]
在从MongoDB解组后,"taiList"形成了JSON对象。以下是从MongoDB中查找数据的函数,错误检查被故意省略了。
func MongoFind(id string) (Data, error) {
filter := bson.M{"_id": id}
var (
result model.Data
)
...
DB.Collection(tailistCollection).FindOne(context.TODO(),filter).Decode(&result)
...
return result, nil
}
MongoFind函数返回Data和错误。我想检查JSON对象"ta"是否包含在"taiList"中。
var ta = model.Tai{
PlmnId: &model.PlmnId{Mcc: "244", Mnc: "34"},
Tac: "00001",
Nid: "555",
}
我尝试了下面的代码:
var data Data
func CheckTai(ta models.Tai, data Data) bool {
for _, Tai := range data.TaiList {
if reflect.DeepEqual(Tai, ta) {
return true
}
}
return false
}
但是CheckTai函数返回false。只有当只有一个与列表匹配的JSON对象时,CheckTai才返回true,如下所示:
{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "555"
}
]
}
需要帮助或者关于如何进行这个检查的想法。
英文:
I have an array of JSON objects as
Structs:
type Data struct {
TaiList []Tai `json:"taiList"`
}
type Tai struct {
PlmnId *PlmnId `json:"plmnId"`
Tac string `json:"tac"`
Nid string `json:"nid"`
}
type PlmnId struct {
Mcc string `json:"mcc"`
Mnc string `json:"mnc"`
}
The JSON in mongodb is of the form
[
{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "99"
},
{
"plmnId": {
"mcc": "244",
"mnc": "34"
},
"tac": "00001",
"nid": "555"
}
]
},
{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "99"
}
]
}
]
The JSON "taiList" is formed after the unmarhsal from mongodb, error check intentionally omitted.
func MongoFind(id string) (Data, error) {
filter := bson.M{"_id": id}
var (
result model.Data
)
...
DB.Collection(tailistCollection).FindOne(context.TODO(),filter).Decode(&result)
...
return result, nil
}
The MongoFind returns Data and error. The Data.TaiList array is what i would like to perform the check.
I would like to check if the JSON object "ta" is contain in the "taiList".
var ta = model.Tai{
PlmnId: &model.PlmnId{Mcc: "244", Mnc: "34"},
Tac: "00001",
Nid: "555",
}
I tried with the code below
var data Data
func CheckTai(ta models.Tai, data Data) bool {
for _, Tai := range data.TaiList {
if reflect.DeepEqual(Tai, ta) {
return true
}
}
return false
}
but CheckTai function return false.
The CheckTai only return true when there is only one JSON object that match the list as
{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "555"
}
]
}
Need help or idea on how to perform this check.
答案1
得分: 3
根据评论中的建议,我按照以下方式复制了您的场景:
package main
import (
"encoding/json"
"fmt"
"log"
"reflect"
)
type Data struct {
TaiList []Tai `json:"taiList"`
}
type Tai struct {
PlmnId *PlmnId `json:"plmnId"`
Tac string `json:"tac"`
Nid string `json:"nid"`
}
type PlmnId struct {
Mcc string `json:"mcc"`
Mnc string `json:"mnc"`
}
var data = []byte(`{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "99"
},
{
"plmnId": {
"mcc": "244",
"mnc": "34"
},
"tac": "00001",
"nid": "555"
}
]
}
`)
var ta = Tai{
PlmnId: &PlmnId{Mcc: "244", Mnc: "34"},
Tac: "00001",
Nid: "555",
}
func CheckTai(ta Tai, data Data) bool {
for _, Tai := range data.TaiList {
if reflect.DeepEqual(Tai, ta) {
return true
}
}
return false
}
func main() {
var v Data
err := json.Unmarshal(data, &v)
if err != nil {
log.Fatal(err)
}
fmt.Println(CheckTai(ta, v))
}
输出结果:
true
英文:
Based on the suggestions from comments I replicated your scenario as follows:
package main
import (
"encoding/json"
"fmt"
"log"
"reflect"
)
type Data struct {
TaiList []Tai `json:"taiList"`
}
type Tai struct {
PlmnId *PlmnId `json:"plmnId"`
Tac string `json:"tac"`
Nid string `json:"nid"`
}
type PlmnId struct {
Mcc string `json:"mcc"`
Mnc string `json:"mnc"`
}
var data = []byte(`{
"taiList": [
{
"plmnId": {
"mcc": "244",
"mnc": "24"
},
"tac": "00001",
"nid": "99"
},
{
"plmnId": {
"mcc": "244",
"mnc": "34"
},
"tac": "00001",
"nid": "555"
}
]
}
`)
var ta = Tai{
PlmnId: &PlmnId{Mcc: "244", Mnc: "34"},
Tac: "00001",
Nid: "555",
}
func CheckTai(ta Tai, data Data) bool {
for _, Tai := range data.TaiList {
if reflect.DeepEqual(Tai, ta) {
return true
}
}
return false
}
func main() {
var v Data
err := json.Unmarshal(data, &v)
if err != nil {
log.Fatal(err)
}
fmt.Println(CheckTai(ta, v))
}
Output:
true
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论