jsontypedef / json-typedef-codegen

A CLI tool that generates code from JSON Typedef schemas
https://jsontypedef.com/docs/tools/jtd-codegen
MIT License
160 stars 31 forks source link

Permit specifying/overriding field names #73

Open BatmanAoD opened 1 year ago

BatmanAoD commented 1 year ago

I have a handwritten struct that is shared between services in Python, TypeScript, C#, and Go.

The Go version has a field like this (where Date is a custom date type):

    EffectiveDate Date `json:"effective"`

It looks like it's currently impossible to generate a drop-in replacement because the field name doesn't match the JSON field name. Would it be possible to add the equivalent of metadata.<lang>Type but for field-naming? I.e., I'd like the schema to be able to generate the field like this:

    "effective": {
      "metadata": {
        "description": "The date that this transaction takes effect",
        "goField": "EffectiveDate"
      },
      "type": "Date"
    },

Presumably the TypeScript generator wouldn't offer this option for the reasons explained here, but I think it makes sense to offer it for all other supported languages.

BatmanAoD commented 1 year ago

I have a workaround that seems a bit dangerous, but should be pretty safe:

Assuming the type in question is called MyType, and the generated version lives in a package called generated, the handwritten type can be replaced with a wrapper using MyType as an embedded struct:

type MyType struct {
    generated.MyType
    // EffectiveDate causes 'Effective' to be ignored while marshaling.
    EffectiveDate Date `json:"effective"`
}

// Effective ensures that clients cannot accidentally access MyType.MyType.Effective.
func (mt MyType) Effective() Date {
    return mt.EffectiveDate
}