Thanks for the reply Burak.
You are indeed right that JsonNode employs standard Java Map, List objects.
Though note that each JsonNode includes specialized
serialize(JsonGenerator, SerializerProvider) methods which I think way
better than reflection-based blind serialization. While this doesn't bring
any memory efficiency, it certainly yields better processing efficiency.
Another potential advantage I was considering for JsonNode is taking
advantage of its object pooling capabilities such as (in pseudo code)
try (var sessionFactory = jsonNodeFactory.clone()) {
JsonNode oldNode = sessionFactory.read(jsonText);
JsonNode newNode = transform(sessionFactory, oldNode);
byte[] newNodeBytes = sessionFactory.write(newNode);
persist(newNodeBytes);
}
Though I am not sure if this is possible at all.
You mentioned about using Avro to represent JSON in memory. To the best of
my knowledge, Avro requires a schema. Maybe I am missing something. Would
you mind elaborating a little bit on your idea here?
Best.
On Wednesday, February 27, 2019 at 12:48:07 PM UTC+1, Burak Emre Kabakcı
wrote:
>
> 1. JsonNode doesn't actually have any magic under the hood. It uses
> Map<String, JsonNode> for objects, List<JsonNode> for arrays and wrapper
> objects for primitive types. Therefore, it's not memory efficient IMO so it
> actually depends on your priorities:
> 1.1. If you care about the code complexity compared to memory
> bottleneck or doesn't really have any schema, I would stick with JsonNode
> as it's feature-rich and well-documented.
> 1.2. If you care about the performance and doesn't really have any
> option to use class data binding, you may write your custom parser and
> deserialize the JSON blob into a more compact representation such as Apache
> Avro rather than JsonNode. If you have a metadata store, you can basically
> parse the JSON blob, validate it and convert them into Avro instances which
> will occupy less heap memory. We prefer this approach as it also provides
> us a native way to validate the JSON blob.
>
> 2. AFAIK, JsonNodeFactory is thread-safe and stateless but it would be
> better if someone who has experience with it could answer this question.
>
> On Tuesday, February 26, 2019 at 11:48:13 PM UTC+3, [email protected]
> wrote:
>>
>> Hello,
>>
>> In a code base I have been working on for more than a year, we receive
>> JSON (as byte[] from queue), we transform JSON, and we persist JSON (to
>> Elasticsearch). In the initial design, tempted by its convenience, we made
>> the mistake of representing the JSON as java.lang.Object in this JSON
>> pipeline. Transformation functions receive Object and spit out Object.
>> Though this introduced other problems (e.g., certain types like Set<V> do
>> not map 1-to-1 to JSON, variable types do not properly communicate the
>> intent of the value, lost caching and object pooling opportunities, etc.)
>> revealed themselves in pretty late stages of the development. If I would
>> have been starting from scratch today, I would pick Jackson's JsonNode as
>> the only allowed JSON type. Though getting off the beaten path might raise
>> other issues that we cannot oversee right now and this is where my question
>> comes into play.
>>
>> 1. What are the best practices to represent JSON documents to allow
>> efficient read/write/update operations? (Note that in our case there is
>> no
>> schema, hence no class data binding.)
>> 2. If one would use JsonNode, what are the best practices for using
>> JsonNodeFactory'ies? A single global factory? A thread-local factory? No
>> factory but explicit JsonNode::new calls?
>>
>> Thanks in advance.
>> Best.
>>
>
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.