JSON文件的解析

本文主要記錄一下JSON文件解析過程中的兩種基本操作方式。
JSON文件的根可以是數組,也可以是對象。接下來就是基於這兩種情況進行基本的JSON文件解析。
首先看以數組爲根的JSON文件解析:
創建一個JSON文本文件json.txt如下:

[
    {
        "id": 1,
        "name": "天下無雙",
        "damage": "123"
    },
    {
        "id": 2,
        "name": "雌雄難辨",
        "damage": "182"
    },
    {
        "id": 3,
        "name": "暗流涌動",
        "damage": "89"
    }
]

接下來是JSON文件解析的所得屬性所對應的承接的對象的數據結構:

class Skill
    {
        private int id { get; set; }
        private string name { get; set; }
        private int damage { get; set; }
        public Skill(int id,string name,int damage)
        {
            this.id = id;
            this.name = name;
            this.damage = damage;

        }
        public override string ToString()
        {
            string s = "";
            s += id;
            s += name;
            s += damage;
            return s;
        }

    }

下面是是解析JSON文件的主方法:

class Program
    {
        static void Main(string[] args)
        {
            #region
            List<Skill> list = new List<Skill>();
            //將JSON文件解析成對象形式存儲到jsonData對象數組中
            JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json.txt"));
            foreach (JsonData temp in jsonData)
            {
                Skill skill = null;
                JsonData idValue = temp["id"];
                JsonData nameValue = temp["name"];
                JsonData damageValue = temp["damage"];
                int id = int.Parse(idValue.ToString());
                string name = nameValue.ToString();
                int damage = int.Parse(damageValue.ToString());
                skill = new Skill(id, name, damage);
                list.Add(skill);
            }
            foreach (Skill temp in list)
            {
                Console.WriteLine(temp);
            }
            Console.Read();
            #endregion



        }
    }

接着來看以對象爲根其中嵌套一個對象數組的JSON文件的解析過程:
創建一個player.txt文件:

{
    "name": "feiyue",
    "level": 99,
    "age": 18,
    "skillList": [
        {
            "id": 1,
            "name": "天下無雙",
            "damage": "123"
        },
        {
            "id": 2,
            "name": "雌雄難辨",
            "damage": "182"
        },
        {
            "id": 3,
            "name": "暗流涌動",
            "damage": "89"
        }
    ]
}

下面是承接JSON文件中屬性的對象的數據結構:

class Player
    {
        private string name;
        private int level;
        private int age;
        private List<Skill> skillList;
        public Player(string name,int level,int age,List<Skill> skillList)//對列表的初始化 就用實例賦值的方法
        {//所以就要求在解析完json後將列表的對象信息先做成一個對象列表,再傳給構造函數
            this.name = name;
            this.level = level;
            this.age = age;
            this.skillList = skillList;
        }
        public override string ToString()
        {
            string s = "";
            s += name;
            s += level;
            s += age;
            foreach (Skill temp in skillList)
            {
                s += temp.ToString();//因爲我已經重寫了skill中的tostring()方法,所以這樣就可以返回一個字符串
            }
            return s;
        }
    }

接下來是解析JSON文件的主要方法:

class Program
    {
        static void Main(string[] args)
        {

            #region

            JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("player.txt"));
            JsonData temp = jsonData;



            Player player = null;
            JsonData nameValue = temp["name"];
            JsonData levelValue = temp["level"];
            JsonData ageValue = temp["age"];
            List<Skill> list = new List<Skill>();//創建一個空的對象列表,用來存放解析出來的對象數組
            foreach (JsonData item in temp["skillList"])
            {
                JsonData idValue = item["id"];
                JsonData nameValue1 = item["name"];
                JsonData damageValue = item["damage"];


                int id = int.Parse(idValue.ToString());
                string name1 = nameValue1.ToString();
                int damage = int.Parse(damageValue.ToString());
                //因爲是一個對象中包含一個對象數組,所以需要將這個對象數組先做成一個對象列表,然後再與其他對象屬性一起調用目標對象的構造函數
                Skill skill = null;

                skill = new Skill(id, name1, damage);
                list.Add(skill);
            }
            string name = nameValue.ToString();
            int level = int.Parse(levelValue.ToString());
            int age = int.Parse(ageValue.ToString());
            player = new Player(name, level, age, list);
            Console.WriteLine(player);


            Console.Read();
            #endregion


        }
    }

上述兩種解析方法是解析JSON文件的基礎方法,還有一些用泛型的方法簡便地解析當JSON文件中對象是同一類型時的文件,但是當JSON文件中的對象不是同一類型時,比如JSON文件中存儲的多個對象,這些對象都繼承於一個公共基類,同時他們又保存有自身的一些屬性方法,此時就不能用泛型的方法進行解析了。就需要使用這種基本的方法構造適當的對象數據結構,進行解析。這是基礎,複雜的解析過程是由這些基礎的方式累積而成的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章