{title:'Bypass Serialization using Readers and InputStreams'}

Juneau serializers treat instances of Readers and InputStreams special by simply serializing their contents directly to the output stream or writer. This allows you to embed fully customized serializer output.

| public class MyBean { | // A bean property that produces raw JSON. | public Reader f1 = new StringReader("{'foo':'bar'}"); | } | | // Produces "{f1:{'foo':'bar'}}" | String json = SimpleJsonSerializer.DEFAULT.toString(new MyBean());

Note that if you're serializing Readers and InputStreams, it's up to you to make sure you're producing valid output (in this case JSON).

A more typical scenario where this is useful is by using swaps to convert POJOs to Readers whose contents are determined via the {@link oaj.BeanSession#getMediaType()} method. In the following example, we're customizing the JSON output for a particular bean type, but leaving all other renditions as-is:

| @Swap(MyBeanSwapSometimes.class) | public class MyBean {...} | | // A swap that produces specialized output for JSON, but default serialization for | // all other media types. | public class MyBeanSwapSometimes extends ObjectSwap<MyBean,Object> { | public Object swap(BeanSession session, MyPojo object) throws Exception { | MediaType mediaType = session.getMediaType(); | if (mediaType.hasSubType("json")) | return new StringReader("{myPojo:'foobar'}"); // Custom JSON output | return object; // Otherwise serialize it as a normal bean | } | }

Due to the nature of the RDF serializers, Readers and InputStreams are serialized as literals, not as RDF text. This is due to the fact that the RDF serializers use a DOM for serialization, so we don't have access to the underlying stream.