package json import ( "sort" "strings" "testing" ) func parseString(s string) (*Node, error) { return Parse(strings.NewReader(s)) } func TestParseJsonNumberArray(t *testing.T) { s := `[1,2,3,4,5,6]` doc, err := parseString(s) if err != nil { t.Fatal(err) } // output like below: // 1 // 2 // ... // 6 if e, g := 6, len(doc.ChildNodes()); e != g { t.Fatalf("excepted %v but got %v", e, g) } var v []string for _, n := range doc.ChildNodes() { v = append(v, n.InnerText()) } if got, expected := strings.Join(v, ","), "1,2,3,4,5,6"; got != expected { t.Fatalf("got %v but expected %v", got, expected) } } func TestParseJsonObject(t *testing.T) { s := `{ "name":"John", "age":31, "city":"New York" }` doc, err := parseString(s) if err != nil { t.Fatal(err) } // output like below: // John // 31 // New York m := make(map[string]string) for _, n := range doc.ChildNodes() { m[n.Data()] = n.InnerText() } expected := []struct { name, value string }{ {"name", "John"}, {"age", "31"}, {"city", "New York"}, } for _, v := range expected { if e, g := v.value, m[v.name]; e != g { t.Fatalf("expected %v=%v,but %v=%v", v.name, e, v.name, g) } } } func TestParseJsonObjectArray(t *testing.T) { s := `[ { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] }, { "name":"BMW", "models":[ "320", "X3", "X5" ] }, { "name":"Fiat", "models":[ "500", "Panda" ] } ]` doc, err := parseString(s) //doc.PrintTree(0) if err != nil { t.Fatal(err) } /** Ford Fiesta Focus Mustang BMW 320 X3 X5 .... */ if e, g := 3, len(doc.ChildNodes()); e != g { t.Fatalf("expected %v, but %v", e, g) } m := make(map[string][]string) for _, n := range doc.ChildNodes() { // Go to the next of the element list. var name string var models []string for _, e := range n.ChildNodes() { if e.data == "name" { // a name node. name = e.InnerText() } else { // a models node. for _, k := range e.ChildNodes() { models = append(models, k.InnerText()) } } } // Sort models list. sort.Strings(models) m[name] = models } expected := []struct { name, value string }{ {"Ford", "Fiesta,Focus,Mustang"}, {"BMW", "320,X3,X5"}, {"Fiat", "500,Panda"}, } for _, v := range expected { if e, g := v.value, strings.Join(m[v.name], ","); e != g { t.Fatalf("expected %v=%v,but %v=%v", v.name, e, v.name, g) } } } func TestParseJson(t *testing.T) { s := `{ "name":"John", "age":30, "cars": [ { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] }, { "name":"BMW", "models":[ "320", "X3", "X5" ] }, { "name":"Fiat", "models":[ "500", "Panda" ] } ] }` doc, err := parseString(s) if err != nil { t.Fatal(err) } n := doc.SelectElement("name") if n == nil { t.Fatal("n is nil") } if n.NextSibling() != nil { t.Fatal("next sibling shoud be nil") } if e, g := "John", n.InnerText(); e != g { t.Fatalf("expected %v but %v", e, g) } cars := doc.SelectElement("cars") if e, g := 3, len(cars.ChildNodes()); e != g { t.Fatalf("expected %v but %v", e, g) } } func TestLargeFloat(t *testing.T) { s := `{ "large_number": 365823929453 }` doc, err := parseString(s) if err != nil { t.Fatal(err) } n := doc.SelectElement("large_number") if n.InnerText() != "365823929453" { t.Fatalf("expected %v but %v", "365823929453", n.InnerText()) } }