Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using JSON arrays in SenseNet settings

If JSON arrays are used in a SenseNet settings object, they are not accessible via the OData API.

For example, consider the following SenseNet settings object, which comes installed at Root/System/Settings/Portal.settings by default:

{
    ClientCacheHeaders: [
        { ContentType: "PreviewImage", MaxAge: 1 },
        { Extension: "jpeg", MaxAge: 604800 },
        { Extension: "gif", MaxAge: 604800 },
        { Extension: "jpg", MaxAge: 604800 },
        { Extension: "png", MaxAge: 604800 },
        { Extension: "swf", MaxAge: 604800 },
        { Extension: "css", MaxAge: 600 },
        { Extension: "js", MaxAge: 600 }
    ],
    UploadFileExtensions: {
        "jpg": "Image",
        "jpeg": "Image",
        "gif": "Image",
        "png": "Image",
        "bmp": "Image",
        "svg": "Image",
        "svgz": "Image",
        "tif": "Image",
        "tiff": "Image",
        "xaml": "WorkflowDefinition",
        "DefaultContentType": "File"
    },
    BinaryHandlerClientCacheMaxAge: 600,
    PermittedAppsWithoutOpenPermission: "Details"
}

When viewing this object through the OData API, the ClientCacheHeaders field is not included:

{
    "d": {
        "UploadFileExtensions.jpg": "Image",
        "UploadFileExtensions.jpeg": "Image",
        "UploadFileExtensions.gif": "Image",
        "UploadFileExtensions.png": "Image",
        "UploadFileExtensions.bmp": "Image",
        "UploadFileExtensions.svg": "Image",
        "UploadFileExtensions.svgz": "Image",
        "UploadFileExtensions.tif": "Image",
        "UploadFileExtensions.tiff": "Image",
        "UploadFileExtensions.xaml": "WorkflowDefinition",
        "UploadFileExtensions.DefaultContentType": "File",
        "BinaryHandlerClientCacheMaxAge": 600,
        "PermittedAppsWithoutOpenPermission": "Details",
    }
}

If you search specifically for the ClientCacheHeaders field using the following query:

Odata.svc/Root/System/Settings('Portal.settings')?&metadata=no&$select=ClientCacheHeaders

the API returns null:

{
    "d": {
        "ClientCacheHeaders": null
    }
}

I know that JSON arrays are allowed in settings files because the above example is referenced in the SenseNet wiki page describing settings usage.

Am I performing my OData query incorrectly, or is this some sort of parsing bug in the SenseNet API?

like image 909
Elijah Holt Avatar asked Sep 05 '17 17:09

Elijah Holt


People also ask

Can JSON contain arrays?

Arrays in JSON are almost the same as arrays in JavaScript. In JSON, array values must be of type string, number, object, array, boolean or null. In JavaScript, array values can be all of the above, plus any other valid JavaScript expression, including functions, dates, and undefined.

What is the correct way to write a JSON array?

A JSON array contains zero, one, or more ordered elements, separated by a comma. The JSON array is surrounded by square brackets [ ] . A JSON array is zero terminated, the first index of the array is zero (0). Therefore, the last index of the array is length - 1.

What is JSON object and JSON array?

JSON Syntax JSON defines only two data structures: objects and arrays. An object is a set of name-value pairs, and an array is a list of values. JSON defines seven value types: string, number, object, array, true, false, and null. The following example shows JSON data for a sample object that contains name-value pairs.


1 Answers

Here's an implementation of the custom OData function suggested by Miklos. Once this is done, you have to register the OData call as described here.

public static class OData
{
    [ODataFunction]
    public static string GetMySettings(Content content)
    {
        var retstr = "";
        try
        {
            var settingsFile = Settings.GetSettingsByName<Settings>("MySettings", content.Path);
            var node = Node.LoadNode(settingsFile.Path) as Settings;
            var bindata = node.GetBinary("Binary");

            using (var sr = bindata.GetStream())
            using (var tr = new System.IO.StreamReader(sr))
                retstr = tr.ReadToEnd();
        }
        catch (Exception e)
        {
            SnLog.WriteException(e);
        }

        return retstr; 
    }
}
like image 175
Thane Plummer Avatar answered Sep 19 '22 21:09

Thane Plummer