Skip to content

Instantly share code, notes, and snippets.

@zell71
Forked from mattbrailsford/Bootstrap.cs
Last active February 12, 2024 12:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zell71/cc4aac07cb16a057d88a6dcbae11851f to your computer and use it in GitHub Desktop.
Save zell71/cc4aac07cb16a057d88a6dcbae11851f to your computer and use it in GitHub Desktop.
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