| description |
|---|
JSON all things! |
CFML supports native JSON support via several key functions and some member functions.
CFML gives us the serializeJSON() function to convert any piece of data to its JSON representation (https://cfdocs.org/serializejson)
serializeJson(
var
[, serializeQueryByColumns = false ]
[, useSecureJSONPrefix = false ]
[, useCustomSerializer = false ]
)Pass in any complex or simple variable to the var argument and JSON will be produced:
person = { name = "Luis Majano", company = "Ortus Solutions", year = 2006};
writeOutput( serializeJSON( person ) );If you are in Lucee, you can even use the toJSON() member function:
person = { name = "Luis Majano", company = "Ortus Solutions", year = 2006};
writeOutput( person.toJSON() );By default CFML will convert the keys in a struct to uppercase in the result JSON document:
person = { name = "Luis Majano", company = "Ortus Solutions", year = 2006};
writeOutput( serializeJSON( person ) );
// Will become
{ "NAME" : "Luis Majano", "COMPANY" : "Ortus Solutions", "YEAR" : 2006 }If you want to preserve the key casing then wrap them in double/single quotes and define the case:
person = {
'Name' = "Luis Majano",
'company' = "Ortus Solutions",
'year' = 2006
};
// Will become
{ "Name" : "Luis Majano", "company" : "Ortus Solutions", "year" : 2006 }Adobe ColdFusion may incorrectly serialize some strings if they can be automatically converted into other types, like numbers or booleans. One workaround is to use a CFC with cfproperty to specify types. Another workaround is to prepend Chr(2) to the value and it will be forced to a string, however, that is an unofficial/undocumented workaround. A more formal workaround is to call setMetadata() as a member function on a struct to force a type:
myStruct = { "zip"="00123" };
myStruct.setMetadata( { "zip": "string" } );
writeOutput( serializeJSON(myStruct) );The inverse of serialization is deserialization (https://cfdocs.org/deserializejson). CFML gives you the deserializeJSON() function that will take a JSON document and produce native CFML data structures for you.
deserializeJSON(
json
[, strictMapping = true ]
[, useCustomSerializer = false ]
)Just pass a JSON document, and off we go with native structs/arrays/dates/strings and booleans.
if( isJson( mydata ) ){
return deserializeJSON( data );
}
person = deserializeJSON( '{"company":"Ortus","name":"Mr OrtusMan"}' );
writeOutput( person.company );This function can also be used as a member function in any string literal:
var deserializedData = myjsonString.deserializeJson();
var data = '[]'.deserializeJson();CFML has a function to test if the incoming string is valid JSON (https://cfdocs.org/isjson) or not: isJSON()
isJSON( "[ 1, 2, 3 ]" )