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文件中存储的多个对象,这些对象都继承于一个公共基类,同时他们又保存有自身的一些属性方法,此时就不能用泛型的方法进行解析了。就需要使用这种基本的方法构造适当的对象数据结构,进行解析。这是基础,复杂的解析过程是由这些基础的方式累积而成的。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页