private void UpdateItems <T>() where T : Item
    {
        string         itemType           = typeof(T).FullName;
        string         aspectDatabasePath = "Assets/ScriptableObjects/Aspects/AspectDatabase.asset";
        AspectDatabase aspectDatabase     = (AspectDatabase)AssetDatabase.LoadAssetAtPath(aspectDatabasePath, typeof(AspectDatabase));
        string         itemsDir           = Path.Combine(Path.Combine(jsonRootDir, "Items"), itemType);

        foreach (string file in Directory.GetFiles(itemsDir, "*.json"))
        {
            string json = File.ReadAllText(file);
            string name = new FileInfo(file).Name.Split('.')[0];
            string path = string.Format("Assets/ScriptableObjects/Items/{0}/{1}.asset", itemType, name);
            T      item = default(T);
            if (File.Exists(path))
            {
                item = (T)AssetDatabase.LoadAssetAtPath(path, typeof(T));
            }
            else
            {
                item = ScriptableObject.CreateInstance <T>();
                SaveAsset(item, path);
            }
            item.AspectDatabase = aspectDatabase;
            item.DeserializeFromJson(json);
            string prefabPath = string.Format("Assets/Prefabs/Items/Items/{0}.asset", name);
            if (File.Exists(prefabPath))
            {
                GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject));
                item.Prefab = prefab;
            }
            string[] spriteFiles = Directory.GetFiles(string.Format("Assets/Sprites/Items/{0}", itemType), string.Format("{0}.*", name));
            if (spriteFiles.Length > 0)
            {
                Sprite sprite = (Sprite)AssetDatabase.LoadAssetAtPath(spriteFiles[0], typeof(Sprite));
                item.Sprite = sprite;
            }

            if (itemType == "Weapon")
            {
                string        skillDatabasePath = "Assets/ScriptableObjects/Characters/Skills/SkillDatabase.asset";
                SkillDatabase skillDatabase     = (SkillDatabase)AssetDatabase.LoadAssetAtPath(skillDatabasePath, typeof(SkillDatabase));
                Weapon        weapon            = item as Weapon;
                string        skill             = Convert.ToString(SerializationUtilitites.DeserializeFromJson <Dictionary <string, object> >(json)["Skill"]);
                weapon.Skill = skillDatabase.SkillByName(skill);
            }
        }

        AssetDatabase.SaveAssets();
        // TODO: Update the Database
    }