一、使用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
- 被转换的对象必须是可被序列化的,需要标记 [System.Serializable] 属性;
- JsonUtility.FromJson 方法只能接受 json 对象,如果是 json 数组会提示错误: JSON must represent an object type。
- 解析方法(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;
}