private ClassModel DeserializeSingleClass(string dataDir, Class_Json charClass)
        {
            ClassModel newClass = new ClassModel()
            {
                Name             = charClass.name != null ? charClass.name : "Unknown",
                ShortName        = charClass.shortName != null ? charClass.shortName : "",
                ID               = charClass.id != null ? charClass.id : "",
                Source           = _Compendium.GetSourceByID(charClass.source != null ? charClass.source : null),
                Markdown         = ResourceHelper.ReadTextFromFile(charClass.file != null ? Path.Combine(dataDir, charClass.file) : ""),
                ShowInClassList  = charClass.showInClassList,
                ShowInFilterList = charClass.showInFilterList,
            };

            // Set all filters
            if (charClass.filters != null)
            {
                foreach (var filter in charClass.filters)
                {
                    newClass.AddFilterProperty(
                        filter.groupID != null ? filter.groupID : "",
                        filter.valueID != null ? filter.valueID : "");
                }
            }

            if (charClass.subclasses != null)
            {
                foreach (var subclass in charClass.subclasses)
                {
                    newClass.AddSubclass(DeserializeSingleClass(dataDir, subclass));
                }
            }

            return(newClass);
        }
        private void DeserializeContentItem(dynamic content, string dataDir, ContentItemModel parent = null)
        {
            // Basic properties
            var newContent = new ContentItemModel()
            {
                Name   = content.name != null ? (string)content.name : "",
                ID     = content.id != null ? (string)content.id : "",
                Source = content.source != null?_Compendium.GetSourceByID((string)content.source) : null,
                             Markdown = content.file != null
                        ? ResourceHelper.ReadTextFromFile(Path.Combine(dataDir, (string)content.file))
                        : "",
                             Parent = parent
            };

            // Set all filters
            if (content.filters != null)
            {
                foreach (var filter in content.filters)
                {
                    newContent.AddFilterProperty(
                        filter.groupID != null ? (string)filter.groupID : "",
                        filter.valueID != null ? (string)filter.valueID : "");
                }
            }

            _Content.Add(newContent);

            // Handle sub-content
            if (content.subcontent != null)
            {
                foreach (var subcontent in content.subcontent)
                {
                    DeserializeContentItem(subcontent, dataDir, newContent);
                }
            }
        }