2016-03-25 16 views
0

Ich habe eine Struktur:Golang JSON Struktur zu Klein funktioniert nicht

type Credentials struct { 
    Username string `json:"username"` 
    Password string `json:"password"` 
    ApplicationId string `json:"application_id"` 
    ApplicationKey string `json:"application_key"` 
} 

Und ich habe meine Felder markiert sie in Kleinbuchstaben.

Jedes Mal, wenn ich die Anwendungs-Tags enthalten, werden diese Felder null, das heißt auf meiner POST-Anfrage ich

{ application_id: '', 
    application_key: '', 
    password: 'myPassword', 
    username: 'myUsername' 
} 

bekommen, aber wenn ich entweder den Tags entfernen (so ApplicatinonId oder ApplicationKey Tag entfernen), dann das Feld tut zeigen

Hier ist, wie ich meine Struktur gesetzt:

func getCredentials() Credentials { 
    raw, err := ioutil.ReadFile(os.Getenv("BASE_PATH") + FILE_Credentials) 
    if err != nil { 
     log.Warn("Could not read credentials file: %s", err.Error()) 
     os.Exit(1) 
    } 

    var credentials Credentials 
    json.Unmarshal(raw, &credentials) 
    return credentials 
} 

My Credential json Datei ist:

{ 
    "Username": "myUsername", 
    "Password": "myPassowrd", 
    "ApplicationId": "someID", 
    "ApplicationKey": "someString" 
} 

Dann poste ich meine Daten mit:

credentials := getCredentials() 
url := GetLoginURL() 

resp, body, requestErr := gorequest.New(). 
    Post(url). 
    Send(credentials). 
    End() 

Aber auf dem Server, bekomme ich sowohl application_id und application_key als leere Zeichenfolge. Aber wenn ich das entsprechende Tag entferne, dann wird dieses Feld gepostet

+0

Bitte zeigen Sie ein minimales Beispiel an, um das Problem zu reproduzieren – JimB

+0

@JimB, Ich habe gerade meine Frage – Kousha

+0

aktualisiert Ihre Datei hat nicht die Schlüssel: 'application_id' und' application_key' – JimB

Antwort

0

die Beispieldatei Ihre Struktur in Go Basierend off sollte wie folgt aussehen;

Sie könnten dies auch vom anderen Ende her angehen und die Einträge in Ihrer Datei so ändern, dass sie so aussehen;

{ 
    "Username": "myUsername", 
    "Password": "myPassowrd", 
    "application_id": "someID", 
    "application_key": "someString" 
} 

Allerdings ist es häufiger der Fall, dass Sie nicht die Daten, die Sie empfangen ändern können (wie wenn ein Dritter API aufrufen), so dass Sie in der Regel Ihre Quelle am Ende zu ändern. Da Sie die Datei steuern und die API in Kleinbuchstaben schreiben möchte, empfehle ich, den Inhalt der Dateien so zu ändern, dass er dem entspricht, was Sie an die API senden. Die andere Möglichkeit, die manchmal notwendig ist, besteht darin, einen anderen Typ zu verwenden und einen Konvertierungshelfer bereitzustellen (vorausgesetzt, Sie haben weder die Datei noch die API gesteuert, würden Sie für jeden unterschiedliche Typen benötigen). Die Go-Encoding-Pakete sind sehr streng. Sie sind vielleicht an Dinge wie json.NET gewöhnt, die fast Übereinstimmungen zuweisen, was hier nicht der Fall ist. Alles, was weniger als eine exakte Übereinstimmung ergibt, ergibt einen Fehler von Unmarshal.

2

Es sieht aus wie Ihre Anmeldeinformationsdatei ist falsch (es muss die Schlüssel application_id und application_key verwenden - Go ist schlau genug, um die Groß-, aber nicht Unterstriche herauszufinden) :

{ 
    "Username": "myUsername", 
    "Password": "myPassowrd", 
    "application_id": "someID", 
    "application_key": "someString" 
}