前言
在游戏中需要生成json的存档文件时(比如游戏中音效大小的存储),就可以使用解释器模式来生成此文件,解释器就相当于翻译员,接下来实现对象和Json文件相互转换的功能。
1.实现Json解释器
对象转换json格式的字符串,需要知道json格式的字符串到底何样,经过查阅资料,感觉介绍的细腻和清晰的就是以下网站:
https://www.cnblogs.com/abella/p/11125685.html
知道格式以后,来尝试一下写出对象转换成json的类,具体代码如下:
public class Student
{
private string name;
private int age;
private List<Student> friends;
public Student(string name,int age)
{
this.name = name;
this.age = age;
friends = new List<Student>();
}
public void AddStudent(Student student)
{
friends.Add(student);
}
public string ToJson(Student student)
{
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.AppendLine("{");
jsonBuilder.AppendFormat("\t\"{0}\" : \"{1}\",", nameof(name),name);
jsonBuilder.AppendFormat("\t\"{0}\" : \"{1}\",", nameof(age), age);
jsonBuilder.AppendFormat("\t\"{0}\" :[",nameof(friends));
foreach (Student stu in friends)
{
jsonBuilder.AppendFormat("\t{\t\t\"{0}\" : \"{1}\",", nameof(name), name);
jsonBuilder.AppendFormat("\t\t\"{0}\" : \"{1}\"\t},", nameof(age), age);
}
jsonBuilder.AppendLine("}");
return jsonBuilder.ToString();
}
}
可以看到ToJson函数拟定了转换成Json格式的方式,但是考虑一个问题,这个只能用于Student类,如果以后定义其他类,难道还要重新定义一个专属的ToJson函数?这个也太糟糕了,作为优秀的程序员可不想重复造一个东西,接下来将思考如何实现所有对象都可以复用Json解释器。
2.解释器复用
C#所有对象都是继承object的,可能这样思考一下object能不能获取参数转换成Json格式的字符串,经过一番资料的查阅,可以使用C#的反射机制来实现object与json文件的相互转换即可,具体实现代码如下:
public static string ToJson(object tmp)
{
StringBuilder builder = new StringBuilder("{");
Type type = tmp.GetType();
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.NonPublic|
BindingFlags.Instance|BindingFlags.Public);
foreach (var item in fieldInfos)
{
if (item.FieldType.BaseType.Name.Equals(nameof(ValueType)))
builder.AppendFormat("\"{0}\":{1},", item.Name, item.GetValue(tmp));
else if (item.FieldType.Name.Equals(nameof(String)))
builder.AppendFormat("\"{0}\":\"{1}\",", item.Name, item.GetValue(tmp));
else
{
}
}
string json = builder.ToString();
json = json.Substring(0, json.Length - 1);//去掉最后一个,
json += "}";
return json;
}
这个对象里面如果存在列表,字典或者其他类对象成员是不会被转换的(以上代码没有实现这个功能),如果想要改成万能的Json解释器,请自行查看有无接口去实现效果。首先思考一下,如果要实现万能解释器,一定是使用递归的方式,因为一个类对象存了别的类的对象,别的类对象又存着别的对象,然后以此类推,可能形成了一个链子。
总结
1.解释器优缺点
优点: 1、增加了新的解释表达式的方式。 2、易于简单实现某种格式文本。
缺点: 1、一个简单语法可能需要复杂的解释场景。2、可利用场景比较少。
2.解释器使用场景
1.json,xml等等的解释器。
2.数据库语法实现简单的调用。