自己使用解析文本类的情况的情况(记录免得一遍遍重试)

一、使用LitJson

1.创建json文件:我通常是随便打开个在线json解析网站,按示例写json文件,然后自动生成实体类(我用的C#),有时候示例太过简单,需要按自己的想法去创建json文件。总是忘,所以记录一下:

[]代表数组

{}代表对象

内容通常以键值对出现(Key:Value),key是字符串,value可以是任意类型(当然解析的时候需要自己去拆箱为所需类型)

举个例子(我的json文件)

{
  "TaskModules": [
    {
      "moduleName": "1.安全防护",
      "TaskQuestionsList": [
        {
          "answerType": "None",
          "question": "是否正确穿戴高压防护安全套装?",
          "answerContent": "未作答"
        },
        {
          "answerType": "None",
          "question": "是否正确设置车辆安全防护区域?",
          "answerContent": "未作答"
        },
        {
          "answerType": "None",
          "question": "是否正确铺设车内辅助安全用品?",
          "answerContent": "未作答"
        }
      ]
    },
    {
      "moduleName": "3.电机控制器检查",
      "TaskQuestionsList": [
        {
          "answerType": "None",
          "question": "电机控制器型号是否与原车一致?",
          "answerContent": "未作答"
        },
        {
          "answerType": "None",
          "question": "电机控制器外观是否符合要求?",
          "answerContent": "未作答"
        },
        {
          "answerType": "None",
          "question": "铭牌信息是否与原车一致?",
          "answerContent": "未作答"
        }
      ]
    }
  ]
}

json文件实体类

    // <summary>
    // 这部分可要可不要,看情况,想单独出来也可以
    // </summary>
    public class TaskModuleData
    {
        public List<TaskModules> TaskModulesList = new List<TaskModules>();
    }
    [Serializable]
    public class TaskModules
    {
        public string moduleName;
        public List<TaskQuestions> TaskQuestionsList = new List<TaskQuestions>();
    }
    [Serializable]
    public class TaskQuestions
    {
        public AnswerType answerType;
        public string question;
        public string answerContent;
    }

    //这部分不是,是我自定义的枚举类,因为我的实体类里需要这部分枚举类的变量
    public enum AnswerType
    {
        None,
        Right,
        Error
    }

我的解析过程

private void ParsingJsonData()
        {
            string jsonPath = BM.BPath.Assets_HotUpdateResources_TextAsset_TaskModuleData__json;
            TextAsset jsText = AssetMgr.Load<TextAsset>(jsonPath);

//上面部分不重要,只是获取json文件,下面才是开始解析
            var datas = JsonMapper.ToObject(jsText.text);
            if (datas != null)
            {
                JsonData jsModuleList = datas["TaskModules"];
                foreach (JsonData item in jsModuleList)
                {
                    TaskModules taskModules = new TaskModules();
                    taskModules.moduleName = item["moduleName"].ToString();
                    JsonData jsQustionList = item["TaskQuestionsList"];
                    foreach (JsonData qustion in jsQustionList)
                    {
                        TaskQuestions taskQuestions = new TaskQuestions();
                        taskQuestions.answerType = (AnswerType)Enum.Parse(typeof(AnswerType), qustion["answerType"].ToString());
                        taskQuestions.question = qustion["question"].ToString();
                        taskQuestions.answerContent = qustion["answerContent"].ToString();
                        taskModules.TaskQuestionsList.Add(taskQuestions);
                    }
                    TaskModulesList.Add(taskModules);
                }
            }
        }

整个解析过程需要注意的是,使用litjson,需要层层解析(这是我的使用过程,有大佬更好的解析方式欢迎指出),每层需要使用JsonData对象来接收解析内容,JsonMapper.ToObject(参数)得到的是一个JsonData类型的对象,想要得到内容,在得到的JsonData对象的[]里填写json文件里的Key值(本例中第一次需要得到一个list,使用的是:

JsonData jsModuleList = datas["TaskModules"];)

整个过程就像一棵树一样,想要得到某个层的内容,需要层层去获取JsonData值,层层解析。

等到最终获取想要数据的时候,需要转换成实体类中对应的类型,通常string直接使用ToString();

本例中我要转成自定义的枚举类型使用的是:

taskQuestions.answerType = (AnswerType)Enum.Parse(typeof(AnswerType), qustion["answerType"].ToString());

此例目前是我使用LitJson过程中遇到的情况。

二、使用JsonUtility

  1. 被转换的对象必须是可被序列化的,需要标记 [System.Serializable] 属性;
  2. JsonUtility.FromJson 方法只能接受 json 对象,如果是 json 数组会提示错误: JSON must represent an object type。
  3. 解析方法(C#实体类中需是字段,不能是属性):
[System.Serializable]
public class DeviceActiveJsonData
{

    /// <summary>
    /// 
    /// </summary>
    public int code;
    /// <summary>
    /// 
    /// </summary>
    public string msg;
    /// <summary>
    /// 
    /// </summary>
    public MyData data = new MyData();
}
[System.Serializable]
public class MyData
{
    /// <summary>
    /// 加密测试
    /// </summary>
    public string name;
    /// <summary>
    /// 
    /// </summary>
    public int state;
    /// <summary>
    /// 
    /// </summary>
    public string end_time;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThousandsOfSongs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值