github.com/Jeffail/benthos/v3@v3.65.0/lib/message/io/json.go (about) 1 package io 2 3 import ( 4 "encoding/json" 5 6 "github.com/Jeffail/benthos/v3/lib/message" 7 "github.com/Jeffail/benthos/v3/lib/message/metadata" 8 "github.com/Jeffail/benthos/v3/lib/types" 9 ) 10 11 //------------------------------------------------------------------------------ 12 13 type partJSONStruct struct { 14 Metadata map[string]string `json:"metadata"` 15 Value string `json:"value"` 16 } 17 18 func partToJSONStruct(p types.Part) partJSONStruct { 19 meta := map[string]string{} 20 p.Metadata().Iter(func(k, v string) error { 21 meta[k] = v 22 return nil 23 }) 24 return partJSONStruct{ 25 Metadata: meta, 26 Value: string(p.Get()), 27 } 28 } 29 30 func partFromJSONStruct(p partJSONStruct) types.Part { 31 part := message.NewPart([]byte(p.Value)) 32 part.SetMetadata(metadata.New(p.Metadata)) 33 return part 34 } 35 36 //------------------------------------------------------------------------------ 37 38 // MessageToJSON converts a message into raw JSON bytes of the form: 39 // [{"value":"foo","metadata":{"bar":"baz"}}] 40 func MessageToJSON(msg types.Message) ([]byte, error) { 41 message := []partJSONStruct{} 42 msg.Iter(func(i int, part types.Part) error { 43 message = append(message, partToJSONStruct(part)) 44 return nil 45 }) 46 return json.Marshal(message) 47 } 48 49 // MessageFromJSON parses JSON bytes into a message type of the form: 50 // [{"value":"foo","metadata":{"bar":"baz"}}] 51 func MessageFromJSON(jsonBytes []byte) (types.Message, error) { 52 var jsonParts []partJSONStruct 53 if err := json.Unmarshal(jsonBytes, &jsonParts); err != nil { 54 return nil, err 55 } 56 msg := message.New(nil) 57 for _, v := range jsonParts { 58 msg.Append(partFromJSONStruct(v)) 59 } 60 return msg, nil 61 } 62 63 //------------------------------------------------------------------------------