当前位置: 首页 > 编程语言 > C#

如何将文件路径数组转换为分层JSON结构Share

时间:2023-04-10 16:11:23 C#

HowtoConvertanArrayofFilePathstoaHierarchicalJSONStructure和路径JSON。该数组如下所示:string[]dirArray={"./proc/15/task/15/exe","./proc/15/task/15/mounts/mounts.xml","./proc/15/task/15/mountinfo/mountinfo.xml","./proc/15/task/15/clear_refs/clear_ref.xml","./proc/14/loginuid/loginuid.xml","./proc/14/sessionid/sessionid.xml","./proc/14/coredump_filter/coredump_filter.xml","./proc/14/io/io.xml"}我定位的目标JSON是这样的:{".":{“文件”:{“名称”:“fileInRoot.xml”},“proc”:{“文件”:{“名称”:“fileInProc.xml”},“15”:{“文件”:{“名称":"fileIn15.xml"},"任务":{"文件":{"名称":"fileInTask.xml"},"15":{"文件":{"名称":"fileInTask.xml"},"mounts":{"file":{"name":"fileInMounts.xml"}},"mountsInfo":{"file":{"name":"fileInMountsInfo.xml"}},"clear_refs":{“文件”:{“名称”:“fileInClear_Refs.xml”}}}}},“14”:{“文件”:{“名称”:“fileIn14.xml”},“任务”:{“文件”:{“名称”:“fileInTask.xml”},“loginUid”:{“文件”:{“名称”:“fileInloginUid.xml”}},“sessionid”:{“文件”:{“名称”:“文件Insessionid.xml"}},"coreDump_filter":{"file":{"name":"fileIncoreDump_filter.xml"}},"io":{"file":{"name":"fileInIo.xml"}}}}我想创建一个JSON文件,允许JSON的消费者组件浏览这个目录结构我一直在尝试使用目录、文件和路径类,但最好的方法是使用java.serializor(?)构造JSON的类,因为我正在遍历数组,边走边解析它的目录和文件?我想我会通过将它分成两部分来解决这个问题。首先,我们需要一种解析目录的方法/文件路径数组并将其放入分层结构中。其次,我们需要采用该结构并将其转换为JSON。(我不完全确定你想使用哪个序列化程序的问题,所以对于这个答案我'我假设Json.Net没问题。)对于第一部分,我将创建一个Dir类,它有一个名称、一个子目录字典(便于查找)和一组文件。我们可以在中创建一个方法此类将解析路径并查找或添加适当的子对象。类Dir{公共字符串名称{得到;放;}publicDictionaryDirs{get;放;}公共HashSet文件{得到;放;}publicDir(stringname){Name=name;Dirs=新字典();文件=新的HashSet();}publicDirFindOrCreate(stringpath,boolmightBeFile=true){inti=path.IndexOf('/');如果(i>-1){Dirdir=FindOrCreate(path.Substring(0,i),false);返回dir.FindOrCreate(path.Substring(i+1),true);}if(path=="")返回这个;//如果名称位于路径的末尾并且包含“.”//我们假设它是一个文件(除非它本身是“.”)if(mightBeFile&&path!="."&&path.Contains(".")){Files.Add(path);归还这个;}Dir孩子;如果(Dirs.ContainsKey(path)){child=Dirs[path];}else{child=newDir(path);Dirs.Add(路径,孩子);返回孩子;使用这个类,我们可以轻松地遍历问题中给出的dirArray并创建目录层次结构:Dirroot=newDir("");foreach(dirArray中的字符串目录){root.FindOrCreate(dir);所以在这一点上,root现在拥有整个目录层次结构。如果需要,您可以直接使用Json.Net序列化此对象以获得合理的JSON结构。但是,它会比您在问题中描述的内容更冗长。这是将生成的JSON:{"Name":"","Dirs":{".":{"Name":".","Dirs":{"proc":{"Name":"proc","Dirs":{"15":{"Name":"15","Dirs":{"task":{"Name":"task","Dirs":{"15":{"Name":"15","Dirs":{"exe":{"Name":"exe","Dirs":{},"Files":[]},"mounts":{"Name":"mounts",“Dirs”:{},“文件”:[“mounts.xml”]},“mountinfo”:{“名称”:“mountinfo”,“Dirs”:{},“文件”:[“mountinfo.xml","moremountinfo.xml"]},"clear_refs":{"Name":"clear_refs","Dirs":{},"Files":["clear_ref.xml"]}},"Files":[]}},"文件":[]}},"文件":[]},"14":{"名称":"14","Dirs":{"loginuid":{"名称":"loginuid",“Dirs”:{},“文件”:[“loginuid.xml”]},“sessionid”:{“名称”:“sessionid”,“Dirs”:{},“文件”:[“sessionid.xml"]},"coredump_filter":{"Name":"coredump_filter","Dirs":{},"Files":["coredump_filter.xml"]},"io":{"Name":"io",“目录”:{},“文件”:[“io.xml”]}},“文件”:[]}},“文件”:[]}},“文件”:[]}},“Files":[]}为了得到你的目标JSON,我们需要一个JsonConverter类:,objectvalue,JsonSerializerserializer){Dirdir=(Dir)value;JObjectobj=newJObject();if(dir.Files.Count>0){JArrayfiles=newJArray();foreach(stringnameindir.文件){files.Add(newJValue(name));}obj.Add("list_of_files",files);}foreach(varkvpindir.Dirs){obj.Add(kvp.Key,JToken.FromObject(kvp.Value,serializer));}obj.WriteTo(writer);}publicoverrideboolCanRead{get{returnfalse;}}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){thrownewNotImplementedException();}}我们可以使用这样的转换器序列化目录层次结构:JsonSerializerSettingssettings=newJsonSerializerSettings();settings.Converters.Add(newDirConverter());设置.Formatting=Formatting.Indented;字符串json=JsonConvert.SerializeObject(根,设置);这是输出请注意,我将原始JSON中的“文件”属性更改为数组,并根据您的评论将其重命名为“list_of_files”,以适应每个目录多个文件的可能性。我还假设永远不会是一个名为“list_of_files”的实际目录。如果可能,您需要将文件数组的名称更改为不会与任何目录名称冲突的其他名称。(如果您收到错误消息“无法将属性list_of_files添加到Newtonsoft.Json.Linq.JObject。对象上已存在同名属性”,这意味着您的数据中有一个名为“list_of_files”的目录。){".":{"proc":{"15":{"task":{"15":{"exe":{},"mounts":{"list_of_files":["mounts.xml"]},“mountinfo”:{“list_of_files”:[“mountinfo.xml”]},“clear_refs”:{“list_of_files”:[“clear_ref.xml”]}}}},“14”:{“loginuid”:{“list_of_files”:[“loginuid.xml”]},“sessionid”:{“list_of_files”:[“sessionid.xml”]},“coredump_filter”:{“list_of_files”:[“coredump_filter.xml”]},"io":{"list_of_files":["io.xml"]}}}}}Fiddle:https://dotnetfiddle.net/ConJiu以上是C#学习教程:Howtoconvertanarrayoffilepathsintoa分层JSON结构分享如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: