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

Streaming support #25

Open
liveforeverx opened this issue Feb 13, 2018 · 7 comments
Open

Streaming support #25

liveforeverx opened this issue Feb 13, 2018 · 7 comments

Comments

@liveforeverx
Copy link

Are there any plans for having streaming support?

@michalmuskala
Copy link
Owner

What exactly do you mean by streaming?

@OvermindDL1
Copy link

I think they mean SAX-style support for reading maybe? I guess?

@liveforeverx
Copy link
Author

@michalmuskala Like this: https://github.com/talentdeficit/jsx#incomplete-input

Something, what allows to decode json partially on the fly without needing to get the whole json.

@michalmuskala
Copy link
Owner

michalmuskala commented Feb 16, 2018

Ah. Thanks. I think such a feature indeed makes sense.

I even did some work on implementing it in #3, but ultimately abandoned it before 1.0 due to complexity, but I think it makes sense to implement it now. This should also allow decoding directly from iodata without converting to a single string first, which might also help with performance in some cases.

The only problem with streaming decoding is handling of numbers - you never know when they end, but I think it will be reasonable to require top-level values to be either strings, objects or arrays.

@tsutsu
Copy link

tsutsu commented Mar 15, 2018

Also, how about streaming encoding, when your top-level input term can be guaranteed to be Enumerable?

Basically, an API function to do this (with perhaps lower overhead):

Stream.concat([
  ["[\n"],
  my_huge_stream |> Stream.map(&Jason.encode_to_iodata!) |> Stream.intersperse(",\n"),
  ["]"]
])
|> Enum.into(File.stream!("foo"))

@jjl
Copy link

jjl commented May 17, 2018

Any news on this? I'm willing to pitch in if it helps move things on, but I've no idea where to start.

@michalmuskala
Copy link
Owner

michalmuskala commented May 18, 2018

As mentioned in #34 if your JSON is line-delimited (and in most "streaming" cases it actually is), the problem is trivial - split on newlines and feed each part separately to Jason.decode/2.

Full streaming implementation is going to be rather complex and will require significant changes to the parser - the simplest approach would be to return a continuation at each point in the parser where it errors with the "unexpected eof" error. Later the user could call the continuation with more data.

There was some initial work in #3, but I abandoned it in favour of releasing 1.0 faster. Unfortunately, I probably won't have time to work on this soon.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants