diff --git a/json.go b/json.go index d0f1e03..6f9e5bf 100644 --- a/json.go +++ b/json.go @@ -2,6 +2,7 @@ package goption import ( "encoding/json" + "fmt" "reflect" "strconv" "strings" @@ -9,21 +10,31 @@ import ( func (c *Optional[T]) UnmarshalJSON(data []byte) error { var ( - err error - asString = string(data) - ) - if strings.HasPrefix(asString, "\"") { - asString, err = strconv.Unquote(asString) - if err != nil { - return err + valuer struct { + Value string `json:"value"` } + asJsonString = strings.ReplaceAll( + fmt.Sprintf(`{"value": %s}`, data), + "\n", + "\\n", + ) + asJsonBytes = []byte(asJsonString) + ) + + if err := json.Unmarshal(asJsonBytes, &valuer); err != nil { + return err } - if asString == "null" { - asString = "" + + if valuer.Value == "null" { + valuer.Value = "" } - c.isValidValue = getIsValidDataBool(asString) + + c.isValidValue = getIsValidDataBool(valuer.Value) if c.isValidValue { - if err := json.Unmarshal(data, &c.value); err != nil { + if err := json.Unmarshal( + []byte(strconv.Quote(valuer.Value)), + &c.value, + ); err != nil { return err } } diff --git a/json_test.go b/json_test.go index 1e921f6..8e6b550 100644 --- a/json_test.go +++ b/json_test.go @@ -20,10 +20,9 @@ var _ = Describe("Json", func() { Describe("UnmarshalJSON", func() { - It("generates optional from json string", func() { + DescribeTable("generates optional from json string", func(expectedNameData string) { var ( - expectedNameData = "a name" - jsonData = []byte(fmt.Sprintf( + jsonData = []byte(fmt.Sprintf( `"%v"`, expectedNameData, )) @@ -33,7 +32,14 @@ var _ = Describe("Json", func() { Expect(err).ToNot(HaveOccurred()) Expect(holder.Get()).To(Equal(expectedNameData)) - }) + }, + Entry("one line string", "a name"), + Entry("multiline strings", `a name +a name +a name + +a name`), + ) When("is as null", func() { DescribeTable("creates an empty optional", func(jsonData []byte) {