]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: add an example for RawMessage
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 2 Oct 2013 22:52:18 +0000 (08:52 +1000)
committerAndrew Gerrand <adg@golang.org>
Wed, 2 Oct 2013 22:52:18 +0000 (08:52 +1000)
RawMessage is useful and mildly non-obvious.
Given the frequency with which RawMessage questions
show up on golang-nuts, and get answered with an example,
I suspect adding an example to the docs might help.

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/14190044

src/pkg/encoding/json/example_test.go

index b8d150eda504c2f986da19a6f94dd2f025bdc449..ea0bc149c36dacd7c3487d0b3cd37a0359c68a85 100644 (file)
@@ -81,3 +81,49 @@ func ExampleDecoder() {
        // Sam: Go fmt who?
        // Ed: Go fmt yourself!
 }
+
+// This example uses RawMessage to delay parsing part of a JSON message.
+func ExampleRawMessage() {
+       type Color struct {
+               Space string
+               Point json.RawMessage // delay parsing until we know the color space
+       }
+       type RGB struct {
+               R uint8
+               G uint8
+               B uint8
+       }
+       type YCbCr struct {
+               Y  uint8
+               Cb int8
+               Cr int8
+       }
+
+       var j = []byte(`[
+               {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}},
+               {"Space": "RGB",   "Point": {"R": 98, "G": 218, "B": 255}}
+       ]`)
+       var colors []Color
+       err := json.Unmarshal(j, &colors)
+       if err != nil {
+               log.Fatalln("error:", err)
+       }
+
+       for _, c := range colors {
+               var dst interface{}
+               switch c.Space {
+               case "RGB":
+                       dst = new(RGB)
+               case "YCbCr":
+                       dst = new(YCbCr)
+               }
+               err := json.Unmarshal(c.Point, dst)
+               if err != nil {
+                       log.Fatalln("error:", err)
+               }
+               fmt.Println(c.Space, dst)
+       }
+       // Output:
+       // YCbCr &{255 0 -10}
+       // RGB &{98 218 255}
+}