Fasterxml/Jackson +1 to that. The scala databinds to case classes are gr8. ~ Joestein On Jul 14, 2015 5:42 PM, "Ewen Cheslack-Postava" <e...@confluent.io> wrote:
> Currently the clients/server mismatch wouldn't be an issue since there are > no client-side uses of JSON, right? That said, if Copycat ends up included > in Kafka we'll need to provide at least one serializer which would be > written in Java and I suspect some people would like JSON to be a candidate > for that. > > I'd personally go with Jackson just because of how widely used it is and so > we have one library for both Scala and Java. The use of JSON in the code > base isn't terribly complex, so I don't think a specialized API for scala > provides much benefit. > > -Ewen > > On Mon, Jul 13, 2015 at 2:05 PM, Ismael Juma <ism...@juma.me.uk> wrote: > > > Hi all, > > > > Kafka currently use scala.util.parsing.json.JSON as its json parser and > it > > has a number of issues: > > > > * It encourages unsafe casts (returns `Option[Any]`) > > * It's slow (it relies on parser combinators under the hood) > > * It's not thread-safe (so external locks are needed to use it in a > > concurrent environment) > > * It's deprecated (it should have never been included in the standard > > library in the first place) > > > > KAFKA-1595[1] has been filed to track this issue. > > > > I initially proposed a change using spray-json's AST with the jawn > > parser[2]. Gwen expressed some reservations about the choice (a previous > > discussion had concluded that Jackson should be used instead) and asked > me > > to raise the issue in the mailing list[3]. > > > > In order to have a fair comparison, I implemented the change using > Jackson > > as well[4]. I paste part of the commit message: > > > > "A thin wrapper over Jackson's Tree Model API is used as the replacement. > > This wrapper > > increases safety while providing a simple, but powerful API through the > > usage of the > > `DecodeJson` type class. Even though this has a maintenance cost, it > makes > > the API > > much more convenient from Scala. A number of tests were added to verify > the > > behaviour of this wrapper. The Scala module for Jackson doesn't provide > any > > help for our current usage, so we don't > > depend on it." > > > > A comparison between the two approaches as I see it: > > > > Similarities: > > > > 1. The code for users of the JSON library is similar > > 2. No third-party dependencies > > 3. Good performance > > > > In favour of using Jackson: > > > > 1. Same library for client and broker > > 2. Widely used > > > > In favour of using spray-json and jawn: > > > > 1. Simple type class based API is included and it has a number of nice > > features: > > 1. Support for parsing into case classes (we don't use this yet, > but > > we could use it to make the code safer and more readable in some > > cases)[5]. > > 2. Very little reflection used (only for retrieving case classes > > field names). > > 3. Write support (could replace our `Json.encode` method). > > 2. Less code to maintain (ie we don't need a wrapper to make it nice > to > > use from Scala) > > 3. No memory overhead from wrapping the Jackson classes (probably not > a > > big deal) > > > > I am happy to go either way as both approaches have been implemented and > I > > am torn between the options. > > > > What do you think? > > > > Best, > > Ismael > > > > [1] https://issues.apache.org/jira/browse/KAFKA-1595 > > [2] > > > > > https://github.com/ijuma/kafka/commit/80974afefc00eb6313a7357e7942d5d86ffce84d > > [3] > > > > > https://issues.apache.org/jira/browse/KAFKA-1595?focusedCommentId=14512881&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14512881 > > [4] > > > > > https://github.com/ijuma/kafka/commit/4ca0f1111eb37e8be2d388b60efacc19bc6788b6 > > [5] The Scala module for Jackson (which is not being used in the commit > > above) also supports this, but it uses a reflection-based approach > instead > > of type classes. > > > > > > -- > Thanks, > Ewen >