Skip to content

Instantly share code, notes, and snippets.

@zell71 zell71/Bootstrap.cs forked from mattbrailsford/Bootstrap.cs
Last active Oct 19, 2017

Embed
What would you like to do?
Indexing JSON values in Umbraco
public class Bootstrapper : ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
base.ApplicationStarted(umbracoApplication, applicationContext);
ExamineManager.Instance.IndexProviderCollection["ExternalIndexer"]
.GatheringNodeData += (sender, e) =>
{
// Extract JSON properties
var fieldKeys = e.Fields.Keys.ToArray();
foreach (var key in fieldKeys)
{
var value = e.Fields[key];
if (value.DetectIsJson())
{
IndexNestedObject(e.Fields, JsonConvert.DeserializeObject(value), key);
}
}
};
}
private void IndexNestedObject(Dictionary<string, string> fields, object obj, string prefix)
{
var objType = obj.GetType();
if (objType == typeof (JObject))
{
var jObj = obj as JObject;
if (jObj != null)
{
foreach (var kvp in jObj)
{
var propKey = prefix + "_" + kvp.Key;
var valueType = kvp.Value.GetType();
if (typeof (JContainer).IsAssignableFrom(valueType))
{
IndexNestedObject(fields, kvp.Value, propKey);
}
else
{
var kvpValue = kvp.Value.ToString();
// i've added this additional logic to handle json data within nested content for things such as related link or nested in nested.
if (kvpValue.DetectIsJson())
{
IndexNestedObject(fields, JsonConvert.DeserializeObject(kvpValue), propKey);
}
else
{
fields.Add(propKey, kvpValue.StripHtml());
}
}
}
}
}
else if (objType == typeof (JArray))
{
var jArr = obj as JArray;
if (jArr != null)
{
for (var i = 0; i < jArr.Count; i++)
{
var itm = jArr[i];
var propKey = prefix + "_" + i;
var valueType = itm.GetType();
if (typeof(JContainer).IsAssignableFrom(valueType))
{
IndexNestedObject(fields, itm, propKey);
}
else
{
fields.Add(propKey, itm.ToString().StripHtml());
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.