1.3 Json案例:使用Unity解析上述复合JSON

前言

通过本篇博客,我会和大家通过一个案例来学习Json的操作,希望本篇博客能为大家的工作过程中带来一些帮助与启发。

Unity json解析JsonUtility_ico


1.3.1 分析JSON值

首先我们需要分析上述JSON文档都有什么,根据规则分析出它包含以下值:

  • 对象
  • 字符串
  • 数字
  • 数组

但是此JSON文档中是多层嵌套关系,对象包含对象,数组包含对象,对象包含数组,这样我们解析下来会很麻烦,但是同时,如果我们将这个JSON文档也解析出来了那我们以后解析各种各样不同复杂程度的JSON文档都不在难倒我们

根据以上JSON文档内容我们可以开发背包装备查看DEMO,由于是DEMO级的,在这里面我们不会对其界面UI进行深入开发,着重开发的还是本章的重点内容解析JSON 。

1.3.2 解析JSON前准备

首先我们将以上JSON文档保存并放在我们工程的Resources>文件目录下,将其命名为“Unity精品专栏之序列化操作之JSON实例”>

Unity json解析JsonUtility_Data_02

再次我们需要在Plugins文件中引入LitJson.dll文件,这个动态库会帮助我们解析JSON文档

Unity json解析JsonUtility_ico_03

最后我们需要借助网上的一个功能“JSON转C#实体类”这是我自己使用的一个网站:https://www.sojson.com/json2csharp.html

Unity json解析JsonUtility_ico_04

将我们的JSON文档复制进去点击生成实体即可,并将结果复制出来为以后解析做准备。

Unity json解析JsonUtility_JSON_05

OK,接下来我们要回到Unity中,在Scripts中新建一个文件夹Json并在里面创建代码命名为“JsonDatabase”,并将我们刚在外部网站上生成的实体类复制进去即可。

代码如下:

public class GetPosition
{
    /// <summary>
    /// 
    /// </summary>
    public double lat { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public double lng { get; set; }
}

public class ElementsItem
{
    /// <summary>
    /// 
    /// </summary>
    public int id { get; set; }
    /// <summary>
    /// 无影剑-艾雷诺
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// Json/Equip/无影剑-艾雷诺
    /// </summary>
    public string icon { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public int count { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public GetPosition getPosition { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string hasShell { get; set; }
    /// <summary>
    /// 史诗
    /// </summary>
    public string quality { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public int price { get; set; }
    /// <summary>
    /// DNF中史诗装备
    /// </summary>
    public string infomation { get; set; }
}

public class SearchDataItem
{
    /// <summary>
    /// 
    /// </summary>
    public List<ElementsItem> elements { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string type { get; set; }
    /// <summary>
    /// 热门装备
    /// </summary>
    public string title { get; set; }
}

public class Data
{
    /// <summary>
    /// 
    /// </summary>
    public List<SearchDataItem> searchData { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string dateTime { get; set; }
}

public class Root
{
    /// <summary>
    /// Unity精品专栏之序列化Json操作Json
    /// </summary>
    public string project { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public string projectTime { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public Data data { get; set; }
}

但是实体代码复制过来了不能说明我们能马上使用,在这里我们在来分析一下我们的Json文档:
我们可以看出在文档中我们有以下的数据不需要解析:

  • project
  • projectTime
  • dateTime

所以排除下来我们需要解析的仅仅只有searchData。
由此我们需要根据我们的分析结构修改我们的实体类,代码如下:

namespace XIAOXIAOUnity.Serialize.Json
{
    /*
     * / <summary>
     * /  Author:xiaoxiaoUnity
     * / data:2021.01.08
     * / Json解析后数据储存类
     * / </summary>
     */
    public class JsonDatabase
    {
        /*
         * / <summary>
         * / 坐标
         * / </summary>
         */
        public class Location
        {
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public double Lat {
                get; set;
            }
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public double Lng {
                get; set;
            }
            public Location( double lat, double lng )
            {
                this.Lat	= lat;
                this.Lng	= lng;
            }
        }

        /*
         * / <summary>
         * / 装备信息
         * / </summary>
         */
        public class ElementsItem
        {
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public int Id {
                get; set;
            }
            /*
             * / <summary>
             * / 
             * / </summary>
             */
            public string Name {
                get; set;
            }
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public string Icon {
                get; set;
            }
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public int count {
                get; set;
            }
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public Location Location {
                get; set;
            }
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public string HasSell {
                get; set;
            }
            /*
             * / <summary>
             * / 
             * / </summary>
             */
            public string Quailty {
                get; set;
            }
            /*
             * / <summary>
             * /
             * / </summary>
             */
            public string Infomation {
                get; set;
            }
            public int Price {
                get; set;
            }
            /*
             * / <summary>
             * / 构造函数
             * / </summary>
             * / <param name="id"></param>
             * / <param name="name"></param>
             * / <param name="icon"></param>
             * / <param name="vis"></param>
             * / <param name="location"></param>
             * / <param name="has"></param>
             * / <param name="info"></param>
             * / <param name="quality"></param>
             * / <param name="price"></param>
             */
            public ElementsItem( int id, string name, string icon, int vis, Location location, string has, string info, string quality, int price )
            {
                this.Id		= id;
                this.Name	= name;
                this.Icon	= icon;
                this.count	= vis;
                this.Location	= location;
                this.HasSell	= has;
                this.Infomation = info;
                this.Quailty	= quality;
                this.Price	= price;
            }
        }
    }
}

到此我们的准备工作才算完成,接下来我们要正式开始对以上JSON进行开发。