装货及;将许多JSON文件反序列化为特定的C#类
我对C#和Unity3D有问题。我想从一个目录中读入一系列的一些到多个JSON文件,并将数据反序列化到每个文件的一个特定类中。我想知道是否有一种快速循环该过程的方法,这样我就不需要一个大的装货及;将许多JSON文件反序列化为特定的C#类,c#,unity3d,json.net,C#,Unity3d,Json.net,我对C#和Unity3D有问题。我想从一个目录中读入一系列的一些到多个JSON文件,并将数据反序列化到每个文件的一个特定类中。我想知道是否有一种快速循环该过程的方法,这样我就不需要一个大的if/switch块或任何东西。反序列化很好,但实际上我很难将每个文件中的数据分配到包含正确类型的对象的列表中 注意:类名与文件名相同。例如,如果文件名是Cars.json,我想找到一个名为CarManager的组件,并使用它将反序列化的数据存储在列表的CarManager.Cars中 我没有经验,而且我还不知
if/switch
块或任何东西。反序列化很好,但实际上我很难将每个文件中的数据分配到包含正确类型的对象的列表中
注意:类名与文件名相同。例如,如果文件名是Cars.json,我想找到一个名为CarManager
的组件
,并使用它将反序列化的数据存储在列表
的CarManager.Cars
中
我没有经验,而且我还不知道如何使用类型
引用。如果有人能解释我如何编写ProcessFile()
方法来成功区分Object
类型,这样我就可以统一存储每个文件的数据,我将不胜感激
干杯
namespace Flight {
public class DatasetManager : MonoBehaviour {
private JsonSerializer serialiser;
private StreamReader streamReader;
private string path;
private string fileName;
private string extension;
public void Start() {
// Define Path
path = Application.dataPath + "/Data/";
extension = "json";
// Construct Serialiser
serialiser = new JsonSerializer();
serialiser.Converters.Add(new StringEnumConverter());
serialiser.NullValueHandling = NullValueHandling.Ignore;
// Import Data
Import();
}
private void Import() {
string[] files = Directory.GetFiles(path, "*." + extension);
if(files.Length == 0) return;
for(int i = 0; i < files.Length; i++) ProcessFile(files[i]);
}
private void ProcessFile(string xFile) {
streamReader = File.OpenText(xFile);
// Read Filename
string plural = Path.GetFileNameWithoutExtension(xFile);
string entity = plural.EndsWith("ies") ? plural.Substring(0,plural.Length-3) + "y" : plural.Substring(0,plural.Length-1);
string manager = entity + "Manager";
// Determine Entity & Manager Types
System.Type entityType = System.Type.GetType("Flight." + entity);
System.Type managerType = System.Type.GetType("Flight." + manager);
if(entityType == null || managerType == null) return;
// Determine List Type
System.Type listType = null;
listType = typeof(List<>).MakeGenericType(entityType);
if(listType == null) return;
// Acquire Data
List<dynamic> data = System.Activator.CreateInstance(listType) as List<dynamic>;
data = serialiser.Deserialize(streamReader, typeof(List<dynamic>)) as List<dynamic>;
if(data == null) return;
// Store Data in Game
GameObject theGame = GameObject.FindGameObjectWithTag("Game");
Component theComponent = theGame.GetComponent(manager);
FieldInfo field = managerType.GetField(plural.ToLower());
/*** How can I proceed from here? ***/
List<dynamic> theList = field.GetValue(theComponent) as List<dynamic>;
field.SetValue(theComponent, data);
}
}
}
名称空间飞行{
公共类数据集管理器:MonoBehavior{
私有JsonSerializer序列化器;
私人StreamReader StreamReader;
私有字符串路径;
私有字符串文件名;
私有字符串扩展;
公开作废开始(){
//定义路径
path=Application.dataPath+“/Data/”;
extension=“json”;
//构造序列化器
serialiser=新的JsonSerializer();
添加(新的StringEnumConverter());
serialiser.NullValueHandling=NullValueHandling.Ignore;
//导入数据
导入();
}
私有无效导入(){
string[]files=目录.GetFiles(路径“*.”+扩展名);
如果(files.Length==0)返回;
对于(inti=0;i
上述代码生成一个参数异常
:
System.Collections.Generic.List1[System.Object]无法转换为目标类型:System.Collections.Generic.List1[Flight.Car]不用担心,已修复。ProcessFile()
中的以下修改代码似乎工作正常:
private void ProcessFile(string xFile) {
// ...
// ...
// Determine List Type
System.Type listType = typeof(List<>).MakeGenericType(entityType);
if(listType == null) return;
// Acquire Data
streamReader = File.OpenText(xFile);
object data = null;
data = System.Activator.CreateInstance(listType);
data = serialiser.Deserialize(streamReader, listType);
if(data == null) return;
// Store Data in Game
GameObject theGame = GameObject.FindGameObjectWithTag("Game");
Component theComponent = theGame.GetComponent(manager);
FieldInfo field = managerType.GetField(plural.ToLower());
field.SetValue(theComponent, data);
}
private void进程文件(字符串xFile){
// ...
// ...
//确定列表类型
System.Type listType=typeof(List).MakeGenericType(entityType);
if(listType==null)返回;
//获取数据
streamReader=File.OpenText(xFile);
对象数据=null;
数据=System.Activator.CreateInstance(listType);
data=serialiser.Deserialize(streamReader,listType);
if(data==null)返回;
//在游戏中存储数据
GameObject theGame=GameObject.FindGameObjectWithTag(“游戏”);
组件组件=游戏。获取组件(管理器);
FieldInfo field=managerType.GetField(复数形式为.ToLower());
字段。设置值(组件、数据);
}