2016-07-21 18 views
0

ich versuche tatsächlich google map api in golang zu verwenden (mit App Engine urlfetch und wenn ich eine Abfrage ausführen, kann ich nicht das Ergebnis in einer Struktur erhalten mein Code.Parse json von Google api Anfrage in golang mit App Engine auf struct

import (

    "google.golang.org/appengine" 
    "google.golang.org/appengine/log" 
    "google.golang.org/appengine/urlfetch" 
    "net/http" 
    "strings" 
    "encoding/json" 
    "encoding/gob" 
    "bytes" 
) 

func GetCoordinatesByAddress(request *http.Request) bool { 

    var results Results 

    ctx := appengine.NewContext(request) 
    client := urlfetch.Client(ctx) 

    resp, err := client.Get("https://maps.googleapis.com/maps/api/geocode/json?address=Suresnes+France"&key=" + ApiKey) 
    if err != nil { 
     return false 
    } 

    decoder := json.NewDecoder(resp.Body) 
    decoder.Decode(&results) 
    log.Debugf(ctx, "", results) 
} 

type Results struct { 
    results []Result 
    status string 
} 

type Result struct { 
    address_components []Address 
    formatted_address string 
    geometry Geometry 
    place_id string 
    types []string 
} 

type Address struct { 
    long_name string 
    short_name string 
    Type []string `json:"type"` 
} 

type Geometry struct { 
    bounds Bounds 
    location LatLng 
    location_type string 
    viewport Bounds 
} 

type Bounds struct { 
    northeast LatLng 
    southwest LatLng 
} 

type LatLng struct { 
    lat float64 
    lng float64 
} 

Abfrageergebnisse (mit rotation)

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Suresnes", 
       "short_name" : "Suresnes", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Hauts-de-Seine", 
       "short_name" : "Hauts-de-Seine", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "Île-de-France", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "92150", 
       "short_name" : "92150", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "92150 Suresnes, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 48.88276, 
        "lng" : 2.2364639 
       }, 
       "southwest" : { 
        "lat" : 48.859284, 
        "lng" : 2.199768 
       } 
      }, 
      "location" : { 
       "lat" : 48.869798, 
       "lng" : 2.219033 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 48.88276, 
        "lng" : 2.2364639 
       }, 
       "southwest" : { 
        "lat" : 48.859284, 
        "lng" : 2.199768 
       } 
      } 
     }, 
     "place_id" : "ChIJ584OtMVk5kcR4DyLaMOCCwQ", 
     "types" : [ "locality", "political" ] 
     } 
    ], 
    "status" : "OK" 
} 

Abfrageergebnis (mit meinem go-Code)

DEBUG: %!(EXTRA controlgoogle.Results={[] }) 

Können Sie mir helfen, diese Abfrage-Ergebnisse in einer Struktur zu analysieren?

Danke

+0

Es hilft Ihrem Debuggen, alles außer dem 'status'-Feld zu kommentieren, der unmarshaller wird glücklich unbekannte Felder verwerfen, so dass es ein einfacherer Testfall ist. Sie können den Anfragetext auch mit ['ioutil.ReadAll'] (https://godoc.org/io/ioutil#example-ReadAll) protokollieren. Sie können auch versuchen wollen [ 'http.Get()'] (https://golang.org/pkg/net/http/#Get) – Plato

+0

ich google appengine bin mit, es nicht möglich ist die Verwendung von HTTP .get – Fantasim

Antwort

2

Achten Sie auf den Fall der Strukturen Felder. Wenn ich mich richtig erinnere, werden Kleinbuchstaben vom Marshaller/Unmarshaller ignoriert, so dass Sie in leeren Strukturen landen. Versuchen Sie, die Felder in Großbuchstaben zu benennen.

0

Struct Felder, die json-Tags müssen exportiert (Versalien- Feldname) werden. Auch sollten Sie json-Tags für alle Ihre Struktur Felder, json Tag muss sein identisch mit den json Felder hinzufügen, die Sie analysieren wollte:

type Address struct { 
    LongName string `json:"long_name"` 
    ShortName string `json:"short_name"` 
    Type  []string `json:"types"` 
} 
a := `{ 
    "long_name" : "Suresnes", 
    "short_name" : "Suresnes", 
    "types" : [ "locality", "political" ] 
}` 

var addr Address 
err := json.NewDecoder(strings.NewReader(a)).Decode(&addr) 
if err != nil { 
    fmt.Println(err) 
} 
fmt.Printf("%+v\n", addr) 


output: {LongName:Suresnes ShortName:Suresnes Type:[locality political]} 
+0

der JSON-Decoder es in Ordnung, wenn Kapitalisierung der einzige Unterschied zwischen Feldnamen behandelt, so dass Sie nicht tun, streng genommen, müssen die JSON-Tags, wenn es Unterschiede nur Kapitalisierung ist. Keine schlechte Idee, sie zur besseren Übersichtlichkeit einzubeziehen. – Kaedys

6

ein JSON unmarshal auf struct, muss er Zugang zu den Mitgliedern, so dass Es kann den Wert aktualisieren. Um den Zugriff zu ermöglichen, müssen Sie die Mitglieder der Struktur exportieren (indem Sie den Mitgliedsnamen in Großbuchstaben beginnen). Die JSON-Felder sollten ebenfalls den Mitgliedern der Struktur zugeordnet werden, indem verwendet wird. Ich habe deine Struktur aktualisiert.

type Results struct { 
    Results []Result `json:"results"` 
    Status string `json:"status"` 
} 

type Result struct { 
    AddressComponents []Address `json:"address_components"` 
    FormattedAddress string `json:"formatted_address"` 
    Geometry Geometry `json:"geometry"` 
    PlaceId string `json:"place_id"` 
    Types []string `json:"types"` 
} 

type Address struct { 
    LongName string `json:"long_name"` 
    ShortName string `json:"short_name"` 
    Types []string `json:"types"` 
} 

type Geometry struct { 
    Bounds Bounds `json:"bounds"` 
    Location LatLng `json:"location"` 
    LocationType string `json:"location_type"` 
    Viewport Bounds `json:"viewport"` 
} 

type Bounds struct { 
    Northeast LatLng `json:"northeast"` 
    Southwest LatLng `json:"southwest"` 
} 

type LatLng struct { 
    Lat float64 `json:"lat"` 
    Lng float64 `json:"lng"` 
} 
+0

Danke, es ist Arbeit! – Fantasim

+0

netter, wusste nicht, dass Sie entweder den Dekorateur oder ein exportierter Struct-Member – Plato

+1

@ Plato: Sie müssen tatsächlich * müssen * die Felder exportiert haben, unabhängig von Decorator. Der Decorator soll verschiedene Feldnamen behandeln (wenn Ihre Variable beispielsweise "UserID" heißt, während das Feld "user_id" heißt). Die JSON-Bibliothek wird automatisch versuchen, Felder abzugleichen, die sich nur in der Groß- und Kleinschreibung unterscheiden, aber nicht für andere Varianten wie Unterstriche. Daher benötigen Sie den Dekorator für diesen Fall. Es kann nichts mit Ihrer Struktur tun, es sei denn die Felder werden exportiert, weil es das Feld nicht einmal sehen kann. – Kaedys

0

von Standard-Kodierung/json Paket Marschall/Abstellungs nur exportierte Felder, so dass Sie Ihre structs zu so etwas wie dies ändern sollte, begann mit Groß- und hat json: „“ -Tag.

type Results struct { 
    Results []Result `json:"results"` 
    Status string `json:"status"` 
}