omissis / go-jsonschema

A tool to generate Go data types from JSON Schema definitions.
MIT License
558 stars 89 forks source link

Add support for `MarshalJSON` #241

Open jamietanna opened 2 months ago

jamietanna commented 2 months ago

I couldn't seem to see anything around why there may not be a MarshalJSON method as well as an UnmarshalJSON, is that intended?

jamietanna commented 2 months ago

~Actually maybe this isn't needed, and I may have thought it was needed due to #242~

This may only be needed alongside #242 where a custom MarshalJSON is needed?

jamietanna commented 2 months ago

This could alternatively be a new Validator that handles the generation of

Example (Apache-2.0 licensed) code that's output from oapi-codegen for the same purpose:

func (a Pong) MarshalJSON() ([]byte, error) {
    var err error
    object := make(map[string]json.RawMessage)

    object["ping"], err = json.Marshal(a.Ping)
    if err != nil {
        return nil, fmt.Errorf("error marshaling 'ping': %w", err)
    }

    for fieldName, field := range a.AdditionalProperties {
        object[fieldName], err = json.Marshal(field)
        if err != nil {
            return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err)
        }
    }
    return json.Marshal(object)
}

For the following (OpenAPI):

    Pong:
      type: object
      required:
        - ping
      properties:
        ping:
          type: string
          example: pong
      additionalProperties:
        type: string
jamietanna commented 2 months ago

Alternatively could we conditionally generate a MarshalJSON method if we detect we have AdditionalProperties?

jamietanna commented 2 months ago

(This may also need tweaking for the unmarshalJSON implementation)