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

Let json-stream formatter escape quotes in strings #59

Closed

Conversation

photz
Copy link

@photz photz commented Jun 26, 2024

Description

I found that the json-stream formatter currently does not escape any quotation marks in strings so that the output won't be well-formed JSON.

For example, this results in invalid JSON being produced:

class Foo { 
  function __construct(public string $foo) {}
}

$serde = new SerdeCommon();
$result = $serde->serialize(new Foo('test " '), format: 'json-stream');

The result will be {"foo":"test " "}.

I am fixing this by overriding the serializeString method to escape quotes.

Motivation and context

I think the issue is self-explanatory.

How has this been tested?

I updated one test to include a quotation mark which caused the test to no longer pass.
I then made the test pass again by supplying an implementation for serializeString that escapes quotes.

Screenshots (if appropriate)

Types of changes

What types of changes does your code introduce? Put an x in all the boxes that apply:

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

Go over all the following points, and put an x in all the boxes that apply.

Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

  • I have read the CONTRIBUTING document.
  • My pull request addresses exactly one patch/feature.
  • I have created a branch for this patch/feature.
  • Each individual commit in the pull request is meaningful.
  • I have added tests to cover my changes.
  • If my change requires a change to the documentation, I have updated it accordingly.

If you're unsure about any of these, don't hesitate to ask. We're here to help!

@photz
Copy link
Author

photz commented Jul 2, 2024

@Crell Would you mind running the workflow once again?

*/
public function serializeString(mixed $runningValue, Field $field, ?string $next): mixed
{
$runningValue->printf('"%s"', is_string($next) ? str_replace('"', '\"', $next) : null);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make more sense to use json_encode() to serialize the string, so that we escape things like , as well? Or would that cause double-encoding?

cf: https://3v4l.org/NfBe9

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you're right and I'll update the PR.

@Crell
Copy link
Owner

Crell commented Jul 20, 2024

@photz Still working on this?

@Crell Crell added the bug Something isn't working label Jul 20, 2024
@Crell Crell closed this in #68 Aug 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants