Skip to main content

json (Source Mapper)

This extension is a JSON-to-Event input mapper. Transports that accept JSON messages can use this extension to convert an incoming JSON message into a stream worker event.

Users can either send a pre-defined JSON format, where event conversion happens without any configurations, or use the JSON path to map from a custom JSON message. In default mapping, the JSON string of the event can be enclosed by the element "event", though optional.

Syntax

CREATE SOURCE <NAME> WITH (map.type="json", enclosing.element="<STRING>", fail.on.missing.attribute="<BOOL>")

Query Parameters

NameDescriptionDefault ValuePossible Data TypesOptionalDynamic
enclosing.elementThis is used to specify the enclosing element when sending multiple events in the same JSON message. Mapper treats the child elements of a given enclosing element as events and executes the JSON path expressions on these child elements. If the enclosing.element is not provided then the multiple-event scenario is disregarded and the JSON path is evaluated based on the root element.\$STRINGYesNo
fail.on.missing.attributeThis parameter allows users to handle unknown attributes.The value of this can either be true or false. By default it is true. If a JSON execution fails or returns null, mapper drops that message. However, setting this property to false prompts mapper to send an event with a null value to Stream App, where users can handle it as required, ie., assign a default value.)trueBOOLYesNo

Example 1

CREATE SOURCE FooStream WITH (type='stream', topic='stock', map.type='json') (symbol string, price float, volume long);

This configuration performs a default JSON input mapping. For a single event, the input is required to be in one of the following formats:

{    
"event":{        
"symbol":"GDN",        
"price":55.6,        
"volume":100    
}
}

or

{    
"symbol":"GDN",    
"price":55.6,    
"volume":100
}

Example 2

CREATE SOURCE FooStream WITH (type='stream', topic='stock', map.type='json') (symbol string, price float, volume long);

This configuration performs a default JSON input mapping. For multiple events, the input is required to be in one of the following formats:

[
{"event":
{"symbol":"GDN","price":55.6,"volume":100}
},
{"event":
{"symbol":"GDN","price":56.6,"volume":99}
},
{"event":
{"symbol":"GDN","price":57.6,"volume":80}
}
]

or

[
{"symbol":"GDN","price":55.6,"volume":100},
{"symbol":"GDN","price":56.6,"volume":99},
{"symbol":"GDN","price":57.6,"volume":80}
]

Example 3

CREATE SOURCE FooStream WITH (type='stream', topic='stock', map.type='json', enclosing.element="$.portfolio", map.attributes.symbol="company.symbol", map.attributes.price="price", map.attributes.volume="volume" ) (symbol string, price float, volume long);

This configuration performs a custom JSON mapping. For a single event, the expected input is similar to the one shown below:

{ 
"portfolio":{     
"stock":{
"volume":100,        
"company":{           
"symbol":"GDN"          
},        
"price":55.6       
}   
}
}

Example 4

CREATE SOURCE FooStream WITH (type='stream', topic='stock', map.type='json', enclosing.element="$.portfolio", map.attributes.symbol = 'stock.company.symbol', map.attributes.price = 'stock.price', map.attributes.volume = 'stock.volume') (symbol string, price float, volume long);```

The configuration performs a custom JSON mapping. For multiple events, expected input looks as follows:

{"portfolio":   
[
{"stock":{
"volume":100,
"company":{
"symbol":"GDN"
},
"price":56.6
}
},
{"stock":{
"volume":200,
"company":{
"symbol":"GDN"
},
"price":57.6
}
}
]
}