diff --git a/cid.go b/cid.go index fd785d6..3145056 100644 --- a/cid.go +++ b/cid.go @@ -3,6 +3,7 @@ package cid import ( "bytes" "encoding/binary" + "encoding/json" "errors" "fmt" "strings" @@ -209,7 +210,19 @@ func (c *Cid) UnmarshalJSON(b []byte) error { if len(b) < 2 { return fmt.Errorf("invalid cid json blob") } - out, err := Decode(string(b[1 : len(b)-1])) + obj := struct { + CidTarget string `json:"/"` + }{} + err := json.Unmarshal(b, &obj) + if err != nil { + return err + } + + if obj.CidTarget == "" { + return fmt.Errorf("cid was incorrectly formatted") + } + + out, err := Decode(obj.CidTarget) if err != nil { return err } @@ -221,7 +234,7 @@ func (c *Cid) UnmarshalJSON(b []byte) error { } func (c *Cid) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf("\"%s\"", c.String())), nil + return []byte(fmt.Sprintf("{\"/\":\"%s\"}", c.String())), nil } func (c *Cid) KeyString() string { diff --git a/cid_test.go b/cid_test.go index 1082517..5a5b939 100644 --- a/cid_test.go +++ b/cid_test.go @@ -2,6 +2,7 @@ package cid import ( "bytes" + "encoding/json" "fmt" "math/rand" "strings" @@ -200,3 +201,17 @@ func TestHexDecode(t *testing.T) { t.Fatal("hash value failed to round trip decoding from hex") } } + +func TestFromJson(t *testing.T) { + cval := "zb2rhhFAEMepUBbGyP1k8tGfz7BSciKXP6GHuUeUsJBaK6cqG" + jsoncid := []byte(`{"/":"` + cval + `"}`) + var c Cid + err := json.Unmarshal(jsoncid, &c) + if err != nil { + t.Fatal(err) + } + + if c.String() != cval { + t.Fatal("json parsing failed") + } +}