new(json): Experiments with json.
authorsgf <sgf.dma@gmail.com>
Fri, 9 Dec 2022 14:15:51 +0000 (17:15 +0300)
committersgf <sgf.dma@gmail.com>
Fri, 9 Dec 2022 14:15:51 +0000 (17:15 +0300)
json/json.go [new file with mode: 0644]

diff --git a/json/json.go b/json/json.go
new file mode 100644 (file)
index 0000000..3f98ea4
--- /dev/null
@@ -0,0 +1,84 @@
+
+package main
+
+import (
+    "fmt"
+    "encoding/json"
+    "time"
+    "encoding"
+    "strings"
+)
+
+type Message struct {
+    Name Name
+    Body Body
+    Time time.Time
+}
+
+// Marshal manually using encoding.TextMarshaler into text.
+type Name string
+
+var _ encoding.TextMarshaler = (Name)("")
+func (v Name) MarshalText() (text []byte, err error) {
+    return []byte(v + " by MarshalText"), nil
+}
+
+var _ encoding.TextUnmarshaler = (*Name)(nil)
+func (v *Name) UnmarshalText(text []byte) error {
+    *v = (Name)(strings.TrimSuffix(string(text), " by MarshalText"))
+    return nil
+}
+
+// Marshal manually using json.MarshalJSON() into json array.
+type Body string
+
+var _ json.Marshaler = (Body)("")
+func (b Body) MarshalJSON() (text []byte, err error) {
+    var arr []string
+    for _, c := range b {
+        arr = append(arr, string(c))
+    }
+    arr = append(arr, " by MarshalJSON")
+    v, err := json.Marshal(arr)
+    return v, err
+}
+
+var _ json.Unmarshaler = (*Body)(nil)
+func (b *Body) UnmarshalJSON(text []byte) error {
+    var v interface{}
+    // Unmarshal into "unknown" type.
+    err := json.Unmarshal(text, &v)
+    if err != nil {
+        return err
+    }
+    var arr []byte
+    for _, c := range v.([]interface{}) {
+        s := c.(string)
+        if s == " by MarshalJSON" {
+            continue
+        }
+        arr = append(arr, ([]byte)(s)...)
+    }
+    *b = Body(arr)
+    return nil
+}
+
+func main() {
+    m0 := Message{"Alice", "Hello", time.Now()}
+    fmt.Printf("m0 = %#v\n", m0)
+
+    b, err := json.Marshal(m0)
+    if err != nil {
+        fmt.Println("Error", err)
+        return
+    }
+    fmt.Printf("json = %v\n", string(b))
+
+    var m1 Message
+    err = json.Unmarshal(b, &m1)
+    if err != nil {
+        fmt.Println("Error", err)
+        return
+    }
+    fmt.Printf("m1 = %#v\n", m1)
+}