Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce JSON::Coder #718

Merged
merged 2 commits into from
Jan 21, 2025
Merged

Introduce JSON::Coder #718

merged 2 commits into from
Jan 21, 2025

Conversation

etiennebarrie
Copy link
Contributor

@etiennebarrie etiennebarrie commented Dec 16, 2024

Since #to_json methods are global, it can sometimes be problematic if you need a given type to be
serialized in different ways in different locations.

Instead it is recommended to use the newer JSON::Coder API:

module MyApp
  API_JSON_CODER = JSON::Coder.new do |object|
    case object
    when Time
      object.iso8601(3)
    else
      object
    end
  end
end

puts MyApp::API_JSON_CODER.dump(Time.now.utc) # => "2025-01-21T08:41:44.286Z"

The provided block is called for all objects that don't have a native JSON equivalent, and
must return a Ruby object that has a native JSON equivalent.

@paddor
Copy link

paddor commented Dec 22, 2024

I love this. That's exactly what I'd need to make sure my Time objects are encoded as ISO8601 with millisecond precision without monkey patching.

Doing this just doesn't feel right:

class Time
  def to_json(*a)
    iso8601(3).to_json(*a)
  end
end

So far I've been relying on Oj's time_format: :xmlschema, second_precision: 3.

byroot added a commit to byroot/json that referenced this pull request Jan 13, 2025
Ref: ruby#718

The existing `Parser` interface is pretty bad, as it forces to
instantiate a new instance for each document.

Instead it's preferable to only take the config and do all the
initialization needed, and then keep the parsing state on the
stack on in ephemeral memory.

This refactor makes the `JSON::Coder` pull request much easier to
implement in a performant way.

Co-Authored-By: Étienne Barrié <[email protected]>
byroot added a commit to byroot/json that referenced this pull request Jan 13, 2025
Ref: ruby#718

The existing `Parser` interface is pretty bad, as it forces to
instantiate a new instance for each document.

Instead it's preferable to only take the config and do all the
initialization needed, and then keep the parsing state on the
stack on in ephemeral memory.

This refactor makes the `JSON::Coder` pull request much easier to
implement in a performant way.

Co-Authored-By: Étienne Barrié <[email protected]>
hsbt pushed a commit to hsbt/ruby that referenced this pull request Jan 14, 2025
…sing state

Ref: ruby/json#718

The existing `Parser` interface is pretty bad, as it forces to
instantiate a new instance for each document.

Instead it's preferable to only take the config and do all the
initialization needed, and then keep the parsing state on the
stack on in ephemeral memory.

This refactor makes the `JSON::Coder` pull request much easier to
implement in a performant way.

ruby/json@c8d5236a92

Co-Authored-By: Étienne Barrié <[email protected]>
hsbt pushed a commit to hsbt/ruby that referenced this pull request Jan 14, 2025
…sing state

Ref: ruby/json#718

The existing `Parser` interface is pretty bad, as it forces to
instantiate a new instance for each document.

Instead it's preferable to only take the config and do all the
initialization needed, and then keep the parsing state on the
stack on in ephemeral memory.

This refactor makes the `JSON::Coder` pull request much easier to
implement in a performant way.

ruby/json@c8d5236a92

Co-Authored-By: Étienne Barrié <[email protected]>
byroot added a commit to ruby/ruby that referenced this pull request Jan 14, 2025
…sing state

Ref: ruby/json#718

The existing `Parser` interface is pretty bad, as it forces to
instantiate a new instance for each document.

Instead it's preferable to only take the config and do all the
initialization needed, and then keep the parsing state on the
stack on in ephemeral memory.

This refactor makes the `JSON::Coder` pull request much easier to
implement in a performant way.

ruby/json@c8d5236a92

Co-Authored-By: Étienne Barrié <[email protected]>
@etiennebarrie etiennebarrie force-pushed the json-coder branch 2 times, most recently from 05eb9af to 10d1699 Compare January 20, 2025 11:48
@byroot byroot marked this pull request as ready for review January 20, 2025 11:49
@byroot byroot changed the title Prototype JSON::Coder Introduce JSON::Coder Jan 20, 2025
@byroot byroot force-pushed the json-coder branch 3 times, most recently from 2ad1363 to 4dccf5b Compare January 21, 2025 09:13
@byroot byroot merged commit 74e3406 into ruby:master Jan 21, 2025
33 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants