cbor icon indicating copy to clipboard operation
cbor copied to clipboard

feature: `IntDecMode` `float64` and `json.Number` modes (`encoding/json` compatibility)

Open extemporalgenome opened this issue 8 months ago • 0 comments

Is your feature request related to a problem? Please describe.

encoding/json's behavior when decoding arbitrary numbers to any is either float64, or json.Number, depending on decoder configuration.

fxamacker/cbor already has pretty good method-signature compatibility with encoding/json, but in the case of untyped decoding, requires additional complexity on the calling code in the form of additional types which must be handled: int64, uint64, and *big.Int.

Describe the solution you'd like

  • Add an IntDecMode value to cause all CBOR integers (including *big.Int) to be decoded as float64 when the destination is *any. This would, of course, be lossy for values far from zero.
  • Add an IntDecMode value to cause all CBOR integers (including *big.Int) to be decoded as json.Number. This would not be especially efficient, but would provide excellent compatibility with encoding/json for existing applications needing arbitrary-precision number support. Internally, this could just use behave like IntDecConvertNone with a post-process call to strconv.FormatInt, strconv.FormatUint, or (*big.Int).String, depending on the underlying type; or some specialized binary-to-decimal converter.
  • Optional: JSONCompatDecOptions and JSONNumberDecOptions (or similar) functions, which set these options, as well as setting DefaultMapType to map[string]any.

extemporalgenome avatar Nov 13 '23 08:11 extemporalgenome