0

I receive a json from an api and i try to unmarshall it, and i don't understand the error that i get :

json: cannot unmarshal string into Go value of type main.test_struct

Here is the json that i get :

INFO: 2017/02/03 17:47:53 ApiRecordGeo.go:66: "{\"lat\":48.892423,\"lng\":2.215331,\"acc\":1962}"

here is my code :

type test_struct struct {
    Lat float32 `json:"lat"`
    Lng float32  `json:"lng"`
    Acc int       `json:"acc"`

}

func postGeo(w http.ResponseWriter, r *http.Request) {
        var t test_struct;
    err := json.NewDecoder(r.Body).Decode(&t)
    if err != nil {
        panic(err)
    }
/*  hah, err := ioutil.ReadAll(r.Body);

    if err != nil {
        panic(err)
    }
    Info.Println(hah)
    s := string(hah)
    Info.Println(s)
    Info.Println(t.Lat)*/
    defer r.Body.Close()
    Info.Println("POST FP")
    w.Header().Set("Access-Control-Allow-Origin", "*")
    fmt.Fprintf(w, "200")
}

If anyone have any clue ... Thanks and regards

edit : Second version still the same error :

type test_struct struct {
    Lat float32 `json:"lat"`
    Lng float32  `json:"lng"`
    Acc int       `json:"acc"`

}

func postGeo(w http.ResponseWriter, r *http.Request) {
        var t test_struct;
    err := json.NewDecoder(r.Body).Decode(&t)
    if err != nil {
        panic(err)
    }
/*  hah, err := ioutil.ReadAll(r.Body);

    if err != nil {
        panic(err)
    }
    Info.Println(hah)
    s := string(hah)
    Info.Println(s)
    Info.Println(t.Lat)*/
    //defer r.Body.Close()
    fmt.Println("POST FP")
    w.Header().Set("Access-Control-Allow-Origin", "*")
    fmt.Fprintf(w, "200")
}

edit ter : here si the code that send the data (in javascript)

var url = "https://www.googleapis.com/geolocation/v1/geolocate?key=666";
$.ajax({
    type: 'POST',
    url: url,
    crossDomain: true,
    success: function(data){
//success jsonp handler - assume content in data.response
        console.log(data);
        var long = data.location.lng ;
        var lat = data.location.lat;
        var params = {long:long, lat:lat};
        url_bis = "http://localhost:9280/post_geo/";
        $.ajax({
            type: 'POST',
            url: url_bis,
            crossDomain: true,
            data: params,
            dataType: 'jsonp',
            success: function(data2){
                console.log(data2);

            },
        });


    },
});
4
  • Is that the literal value you get in the body, quotes and all, or is it a value contained in a larger json body? If that's the case it's a string containing json, and you need to un-quote it. Commented Feb 3, 2017 at 17:18
  • @JimB this is the json there is no quote normally in the json that i get. The print is what i get when i uncomment the code to print the body Commented Feb 3, 2017 at 17:37
  • The error is specific, you are giving it a string, and if there are no quotes normally, then it will work. I don't know what Info.Println is doing to format arguments, may show the output via a plain fmt.Println so we can better guess what you're working with. (BTW, you don't need to call r.Body.Close) Commented Feb 3, 2017 at 17:47
  • Here's a simplified version: play.golang.org/p/_JrwAIxU9a Unfortunately it works just fine. May it be that you get in a body a string escaped twice? Commented Feb 3, 2017 at 17:52

1 Answer 1

2

The tricky part is how the data is sent by a jQuery.ajax(). In a documentation you may find:

By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded".

Which means that data the script is sending looks more like:

lat=48.892423&lng=2.215331&acc=1962
Sign up to request clarification or add additional context in comments.

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.