1

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.

func Search_num(mobilenumber string) {

    //.......get request.......

    body, err := io.ReadAll(search_res.Body)
    if err != nil {
        log.Fatalln(err)
    }
    defer search_res.Body.Close()

    var jsonbody Response

    if err := json.Unmarshal(body, &jsonbody); err != nil {
        log.Fatalln(err)
    }

    for _, p := range jsonbody.Data {
        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)

        
    }

    return output

}

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 :|

2 Answers 2

2

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) {

//.......get request.......

body, err := io.ReadAll(search_res.Body)
if err != nil {
    log.Fatalln(err)
}
defer search_res.Body.Close()

var jsonbody Response

if err := json.Unmarshal(body, &jsonbody); err != nil {
    log.Fatalln(err)
}

var output string
for _, p := range jsonbody.Data {
    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)
    
}

return output

}

Sign up to request clarification or add additional context in comments.

Comments

0

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

[
  {"name" : "name1", "mobile": "123", "email": "[email protected]", "carrier": "carrier1", "city", "city1"},
  {"name" : "name2", "mobile": "1234", "email": "[email protected]", "carrier": "carrier2", "city", "city2"}
  ...
]

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:

type Response struct {
  Name string
  Mobile string
  Email string
  Carrier string
  City string
}

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

func Search_num(mobilenumber string) string {

    //.......get request.......

    body, err := io.ReadAll(search_res.Body)
    if err != nil {
        log.Fatalln(err)
    }
    defer search_res.Body.Close()

    var responses []Response

    if err := json.Unmarshal(body, &responses); err != nil {
        log.Fatalln(err)
    }

    for _, p := range responses {
        if p.Mobile == mobilenumber {
            return fmt.Sprintf("Name : %s\nMobile : %s\nEmail : %s\nCarrier : %s\nCity : %s\n", p.Name, p.Mobile, p.Email, p.Carrier, p.City)
        }
    }

    return mobilenumber+" not found"
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.