return json parsed output in for loop in golang

huangapple go评论116阅读模式
英文:

return json parsed output in for loop in golang

问题

你想从这个函数中返回下面的JSON响应output,以便在另一个函数中使用返回的值。但是在for循环中你无法这样做,有没有解决办法呢?

我看到了一些解决方案,但不太清楚如何将下面的JSON字符串fmt.Sprintf("Name : %s\nMobile : %s\nEmail : %s\nCarrier : %s\nCity : %s\n", p.Name, p.Phone.Mobile, p.INTaddress.Email, p.Phone.Carrier, p.Address.City)赋值给一个切片。

英文:

i want to return the below json response output from this function, so i can use that returned value in another function.
but in the for loop i cant able to do that
is there any solution for this.

  1. func Search_num(mobilenumber string) {
  2. //.......get request.......
  3. body, err := io.ReadAll(search_res.Body)
  4. if err != nil {
  5. log.Fatalln(err)
  6. }
  7. defer search_res.Body.Close()
  8. var jsonbody Response
  9. if err := json.Unmarshal(body, &jsonbody); err != nil {
  10. log.Fatalln(err)
  11. }
  12. for _, p := range jsonbody.Data {
  13. output := fmt.Sprintf("Name : %s\nMobile : %s\nEmail : %s\nCarrier : %s\nCity : %s\n", p.Name, p.Phone.Mobile, p.INTaddress.Email, p.Phone.Carrier, p.Address.City)
  14. }
  15. return output
  16. }

seen some solutions but didnt understood how to assign the below json fmt.Sprintf("Name : %s\nMobile : %s\nEmail : %s\nCarrier : %s\nCity : %s\n", p.Name, p.Phone.Mobile, p.INTaddress.Email, p.Phone.Carrier, p.Address.City) in a slice return json parsed output in for loop in golang

答案1

得分: 2

像这样,在for循环中不使用:=,而是使用=。并且for循环看起来是不需要的,只需根据需要使用jsonbody.Data[0]或jsonbody.Data[len(jsonbody.Data)-1]。

func Search_num(mobilenumber string) {

  1. //.......获取请求.......
  2. body, err := io.ReadAll(search_res.Body)
  3. if err != nil {
  4. log.Fatalln(err)
  5. }
  6. defer search_res.Body.Close()
  7. var jsonbody Response
  8. if err := json.Unmarshal(body, &jsonbody); err != nil {
  9. log.Fatalln(err)
  10. }
  11. var output string
  12. for _, p := range jsonbody.Data {
  13. output = fmt.Sprintf("姓名:%s\n手机号:%s\n电子邮件:%s\n运营商:%s\n城市:%s\n", p.Name, p.Phone.Mobile, p.INTaddress.Email, p.Phone.Carrier, p.Address.City)
  14. }
  15. return output

}

英文:

like this, output not use := in the for range, just use = 。 and for loop sees not need, just you demand use jsonbody.Data[0] or jsonbody.Data[len(jsonbody.Data)-1]

func Search_num(mobilenumber string) {

  1. //.......get request.......
  2. body, err := io.ReadAll(search_res.Body)
  3. if err != nil {
  4. log.Fatalln(err)
  5. }
  6. defer search_res.Body.Close()
  7. var jsonbody Response
  8. if err := json.Unmarshal(body, &jsonbody); err != nil {
  9. log.Fatalln(err)
  10. }
  11. var output string
  12. for _, p := range jsonbody.Data {
  13. output = fmt.Sprintf("Name : %s\nMobile : %s\nEmail : %s\nCarrier : %s\nCity : %s\n", p.Name, p.Phone.Mobile, p.INTaddress.Email, p.Phone.Carrier, p.Address.City)
  14. }
  15. return output

}

答案2

得分: 0

如果我理解正确,你有一个格式为json的数据:

  1. [
  2. {"name" : "name1", "mobile": "123", "email": "email1@example.com", "carrier": "carrier1", "city", "city1"},
  3. {"name" : "name2", "mobile": "1234", "email": "email2@example.com", "carrier": "carrier2", "city", "city2"}
  4. ...
  5. ]

你想要在这个数据中搜索,找到对应的号码(例如1234),并返回整个结构,使用你的Sprintf进行格式化。

如果你的Response结构体如下所示:

  1. type Response struct {
  2. Name string
  3. Mobile string
  4. Email string
  5. Carrier string
  6. City string
  7. }

那么你需要将它们提供给Unmarshaler来获取它们。像这样:

  1. func Search_num(mobilenumber string) string {
  2. //.......获取请求.......
  3. body, err := io.ReadAll(search_res.Body)
  4. if err != nil {
  5. log.Fatalln(err)
  6. }
  7. defer search_res.Body.Close()
  8. var responses []Response
  9. if err := json.Unmarshal(body, &responses); err != nil {
  10. log.Fatalln(err)
  11. }
  12. for _, p := range responses {
  13. if p.Mobile == mobilenumber {
  14. return fmt.Sprintf("Name : %s\nMobile : %s\nEmail : %s\nCarrier : %s\nCity : %s\n", p.Name, p.Mobile, p.Email, p.Carrier, p.City)
  15. }
  16. }
  17. return mobilenumber+" not found"
  18. }
英文:

If I get this correctly you have a json of the format:

  1. [
  2. {"name" : "name1", "mobile": "123", "email": "email1@example.com", "carrier": "carrier1", "city", "city1"},
  3. {"name" : "name2", "mobile": "1234", "email": "email2@example.com", "carrier": "carrier2", "city", "city2"}
  4. ...
  5. ]

which you would like to search through, find the number (eg 1234) and return the whole struct formatted using your Sprintf

If your Response struct is like:

  1. type Response struct {
  2. Name string
  3. Mobile string
  4. Email string
  5. Carrier string
  6. City string
  7. }

Then you need to provide a slice of those into the Unmarshaler to get them back. Like:

  1. func Search_num(mobilenumber string) string {
  2. //.......get request.......
  3. body, err := io.ReadAll(search_res.Body)
  4. if err != nil {
  5. log.Fatalln(err)
  6. }
  7. defer search_res.Body.Close()
  8. var responses []Response
  9. if err := json.Unmarshal(body, &responses); err != nil {
  10. log.Fatalln(err)
  11. }
  12. for _, p := range responses {
  13. if p.Mobile == mobilenumber {
  14. return fmt.Sprintf("Name : %s\nMobile : %s\nEmail : %s\nCarrier : %s\nCity : %s\n", p.Name, p.Mobile, p.Email, p.Carrier, p.City)
  15. }
  16. }
  17. return mobilenumber+" not found"
  18. }

huangapple
  • 本文由 发表于 2022年10月9日 18:30:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/74003977.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定