Write to JSON Stream Programmatically
Updated: Feb 21, 2022
This example shows how to create a JSON stream in Java using the JsonTemplate and JsonWriter classes. The demo code creates some test data in memory and writes it to a JSON stream. However, a JSON stream can be created from other input sources like CSV, Excel, etc.
This example can easily be modified to show how to read from a JSON stream or create a JSON stream simply.
Java Code Listing
package com.northconcepts.datapipeline.examples.cookbook; import java.io.FileWriter; import com.northconcepts.datapipeline.core.Record; import com.northconcepts.datapipeline.core.RecordList; import com.northconcepts.datapipeline.job.Job; import com.northconcepts.datapipeline.json.JsonWriter; import com.northconcepts.datapipeline.json.builder.JsonDetailMarker; import com.northconcepts.datapipeline.json.builder.JsonObject; import com.northconcepts.datapipeline.json.builder.JsonTemplate; import com.northconcepts.datapipeline.memory.MemoryReader; public class WriteToJsonStreamProgrammatically { /* Produces the following JSON (line breaks added for clarity) { "actors":{ "north-america":[ { "stage-name":"John Wayne", "real-name":"Marion Robert Morrison", "gender":"male", "city":"Winterset", "balance":156.35 }, { "stage-name":"Spiderman", "real-name":"Peter Parker", "gender":"male", "city":"New York" } ] } } */ public static void main(String[] args) throws Throwable { Record record1 = new Record(); record1.setField("stageName", "John Wayne"); record1.setField("realName", "Marion Robert Morrison"); record1.setField("gender", "male"); record1.setField("city", "Winterset"); record1.setField("balance", 156.35); Record record2 = new Record(); record2.getField("stageName", true).setValue("Spiderman"); record2.getField("realName", true).setValue("Peter Parker"); record2.getField("gender", true).setValue("male"); record2.getField("city", true).setValue("New York"); record2.getField("balance", true).setValue(-0.96); MemoryReader reader = new MemoryReader(new RecordList(record1, record2)); // create the JSON template // arguments to field(), objectField(), arrayField(), and when() are expressions // literal strings must be quoted JsonTemplate template = new JsonTemplate(); // detail() marks the node where records are added JsonDetailMarker detailElement = template.object().object("'actors'").array("'north-america'").detail(); JsonObject actor = detailElement.object(); actor.field("'stage-name'", "stageName"); actor.field("'real-name'", "realName"); actor.field("'gender'", "gender"); actor.field("'city'", "city"); actor.when("balance >= 0").field("'balance'", "balance"); // add this field when balance is not negative // add the template to the writer JsonWriter writer = new JsonWriter(template, new FileWriter("example/data/output/credit-balance-03.json")); Job.run(reader, writer); } }
Code Walkthrough
- Two Record objects are created in memory with the fields
stageName
,realName
,gender
,city
andbalance
set to some test values. - A RecordList is created with these Records.
- A MemoryReader is created to read this RecordList.
- The JSON stream structure is created using the JsonTemplate, JSonDetailMarker and JsonObject instances.
- A JsonWriter is created using the
JsonTemplate and the path of the output file
credit-balance-03.json
. - Data is transferred from memory to the output JSON file via JobTemplate.DEFAULT.transfer method.
JSON stream creation
The following steps eleborate how the JSON stream is created (Step 4 above):
- First a JsonTemplate is created.
- The template.object method is invoked to obtain the JsonObject corresponding to the template.
- A JsonObject is then created
corresponding to the
actors
field via JsonObject.object("'actors'"). - A JsonArray is created corresponding to the
north-america
field via the object.array method. - The array.detail method is invoked to indicate that this element has sub-elements which returns a JSonDetailMarker.
- A new JsonObject is created corresponding to the
actor
element via JsonDetailMarker.object. - The
stageName
,realName
,gender
,city
andbalance
fields are set via actor.field method. This method accepts two String parameters, the first String specifies the field name to be used in the output JSON stream and the second String specifies the field name in the input Record object that should be used to get the value of this field name. - The actor.when
method is used to create and add a
balance
field only when the balance is non negative.
JsonTemplate and JsonObject
JsonTemplate and JsonObject are the main classes used to create the output JSON stream. JsonTemplate is a high level abstraction which represents the entire JSON stream. JsonObject represents an individual JSON element.
Output JSON stream
{ "actors":{ "north-america":[ { "stage-name":"John Wayne", "real-name":"Marion Robert Morrison", "gender":"male", "city":"Winterset", "balance":156.35 }, { "stage-name":"Spiderman", "real-name":"Peter Parker", "gender":"male", "city":"New York" } ] } }