装载&将许多JSON文件反序列化为特定的C#类

时间:2015-09-30 21:05:46

标签: c# unity3d json.net

我遇到了C#和Unity3D的问题。我想从单个目录中读取一系列一些到多个JSON文件,并将数据反序列化为每个文件的一个特定类。我想知道是否有一种快速循环该过程的方法,所以我不需要大的if/switch块或任何东西。反序列化很好,但我实际上无法将每个文件中的数据分配到包含正确Type对象的列表。

注意:类名与文件名相同。例如,如果文件名为 Cars.json ,我想找到一个名为Component的{​​{1}},并使用它将反序列化的数据存储在CarManagerList<Car>

我没有经验,我还不知道如何使用CarManager.cars引用。如果有人可以解释如何编写Type方法来成功区分ProcessFile()类型,那么我可以在Unity中存储每个文件的数据,我真的很感激。

干杯。

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); } } }

System.Collections.Generic.List1 [System.Object]无法转换为目标类型:System.Collections.Generic.List1 [Flight.Car]

1 个答案:

答案 0 :(得分:0)

不用担心,修复它。 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);
}