JsonParser.getCurrentLocation is not updated for `DataInput` input
Issue
Using a JsonParser instantiated via JsonParser.createParser(DataInput) does not update JsonLocation values returned by JsonParser.getCurrentLocation (everything defaults to -1).
Switching to JsonParser.createParser(InputStream) with the same input object populates the JsonLocation data as expected.
Use case
I use JsonParser to manually extract slices of Netty byte buffers (that contain Json). To feed Netty ByteBufs to JsonParser, I have to wrap the ByteBuf in a ByteBufInputStream which extends InputStream and implements DataInput. JsonParser accepts both types so explicit casting is required.
- This works and populates
JsonLocationvalues:
ByteBuf buf = ...;
JsonParser parser = JSON_FACTORY.createParser((InputStream) new ByteBufInputStream(buf));
- This does not populate
JsonLocationvalues:
ByteBuf buf = ...;
JsonParser parser = JSON_FACTORY.createParser((DataInput) new ByteBufInputStream(buf));
Issue affects at least versions 2.9.8 and 2.10.2.
Yeah, this is missing, as there is no input pointer to use. So it's not a simple tweak.
I am not sure why it works for InputStream and not DataInput though.
Are there any methods InputStream provides that DataInput does not (to make this work in Jackson)?
It's just because all reads from InputStream / Reader are buffered first and access is from those buffers; single-byte/char reads are not used. In contrast, DataInput is read byte-by-byte (leading to lower performance). There is no way to safely try bulk reads either, as far as I know. So to keep track of location, separate byte counter would need to be maintained.