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
| Name | Description | Default Value | Possible Data Types | Optional | Dynamic | 
|---|---|---|---|---|---|
| enclosing.element | This 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. | \$ | STRING | Yes | No | 
| fail.on.missing.attribute | This 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.) | true | BOOL | Yes | No | 
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
            }
        }
    ]
}