2016-06-07 8 views
4

In Go normalerweise entpacke ich meine JSON in eine Struktur und lesen Sie Werte aus der Struktur .. es funktioniert sehr gut.Manuell JSON-Werte lesen

Dieses Mal bin ich nur mit einem bestimmten Element eines JSON-Objekts beschäftigt und weil das gesamte JSON-Objekt sehr groß ist, möchte ich keine Struktur erstellen müssen.

Gibt es einen Weg in Go, so dass ich Werte im JSON-Objekt mit Schlüsseln oder iterate Arrays wie üblich nachschlagen kann.

In Anbetracht der folgenden JSON wie konnte ich nur das Feld title herausziehen.

{ 
    "title": "Found a bug", 
    "body": "I'm having a problem with this.", 
    "assignee": "octocat", 
    "milestone": 1, 
    "labels": [ 
    "bug" 
    ] 
} 
+2

Sie eine Struktur ausschließlich für die Teile machen Sie wollen. Dies aus dem json-Paket unter Unmarshal(): * Um Unmarshal JSON in eine Struktur zu entlarven, gleicht Unmarshal eingehende Objektschlüssel mit den von Marshal verwendeten Schlüsseln ab (entweder den Namen des Strukturfelds oder seines Tags), bevorzugt eine exakte Übereinstimmung, akzeptiert aber auch einen Fall -inssensitive Übereinstimmung: Unmarshal setzt nur exportierte Felder der Struktur. "* Wenn das Feld nicht existiert, sollte das JSON-Schlüssel/Wert-Paar einfach ignoriert werden. – Snowman

+0

Ah ok, ich dachte es würde sich über unübertroffene Felder beschweren. Vielen Dank. – conor

Antwort

1

Um Darigaaz Antwort zu verlängern, können Sie auch eine anonyme Struktur innerhalb der Parsing-Funktion erklärt verwenden. Auf diese Weise wird vermieden, dass Deklarationen auf Paketebene für den Code für Einzelfälle erforderlich sind.

https://play.golang.org/p/MkOo1KNVbs

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    test := `{ 
     "title": "Found a bug", 
     "body": "I'm having a problem with this.", 
     "assignee": "octocat", 
     "milestone": 1, 
     "labels": [ 
      "bug" 
     ] 
    }` 

    var s struct { 
     Title string `json:"title"` 
    } 
    json.Unmarshal([]byte(test), &s) 

    fmt.Printf("%#v", s) 

} 
-4

Update: Diese Antwort ist falsch; Ich lasse es als ein Beispiel dafür, was nicht zu tun.

Sie sollten es mit einem regulären Ausdruck nachschlagen dann (Pseudo-Code):

String s = {json source}; 
int i = s.indexOf("\"title\": \"") 
s.substring(i,s.indexOf("\"",i)) 

more on substrings in Java

+0

{"body": "here goes \" title \ ": \" Wähle mich \ "", "title": "Fang mich, wenn du kannst"} – Darigaaz

+0

@Darigaaz? Ist das, weil ich eine einfache Lösung oder einen Strahl der Inspiration überkomplize? – Vale

+0

"strukturierten" Text wie json/html/xml mit Regex zu parsen ist im Allgemeinen eine schlechte Idee. Und ich gab dir ein Beispiel. – Darigaaz

6

Dont erklären Felder, die Sie nicht wollen.

https://play.golang.org/p/cQeMkUCyFy

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type Struct struct { 
    Title string `json:"title"` 
} 

func main() { 
    test := `{ 
     "title": "Found a bug", 
     "body": "I'm having a problem with this.", 
     "assignee": "octocat", 
     "milestone": 1, 
     "labels": [ 
      "bug" 
     ] 
    }` 

    var s Struct 
    json.Unmarshal([]byte(test), &s) 

    fmt.Printf("%#v", s) 

} 

Oder wenn Sie komplett von structs loszuwerden: Oder

var i interface{} 
json.Unmarshal([]byte(test), &i) 

fmt.Printf("%#v\n", i) 
fmt.Println(i.(map[string]interface{})["title"].(string)) 

. Es wird alle Konvertierungsfehler verschlucken.

m := make(map[string]string) 

json.Unmarshal([]byte(test), interface{}(&m)) 

fmt.Printf("%#v\n", m) 
fmt.Println(m["title"]) 
0

Check out go-simplejson

Beispiel:

js, err := simplejson.NewJson([]byte(`{ 
    "test": { 
    "string_array": ["asdf", "ghjk", "zxcv"], 
    "string_array_null": ["abc", null, "efg"], 
    "array": [1, "2", 3], 
    "arraywithsubs": [{"subkeyone": 1}, 
    {"subkeytwo": 2, "subkeythree": 3}], 
    "int": 10, 
    "float": 5.150, 
    "string": "simplejson", 
    "bool": true, 
    "sub_obj": {"a": 1} 
    } 
}`)) 

if _, ok = js.CheckGet("test"); !ok { 
    // Missing test struct 
} 

aws := js.Get("test").Get("arraywithsubs") 
aws.GetIndex(0) 
+0

Danke aber, imho, das ist zu trivial ein Problem, um eine externe Abhängigkeit hinzuzufügen. – conor

+1

@conor Natürlich hängt alles von Ihren Bedürfnissen ab.Ich mag diese Bibliothek besonders, wenn ich zB JSON-Payloads Unit-Test testen muss. Aber gute Angewohnheit, keine Drittanbieter-Bibliotheken für kleine Aufgaben hinzuzufügen :) – basgys