2015-07-26 13 views
0

С помощью следующего кода:Создания из дерева файлов каталога с Json.NET LINQ

static void Main(string[] args) 
    { 
     JObject fileSystemTree = CreateFileSystemJsonTree("C:/DirectoryTree"); 
     Console.WriteLine(fileSystemTree); 
     Console.WriteLine("------"); 
     // 
     // Write it out to a file 
     // 
     System.IO.File.WriteAllText(@"C:\jsontree.txt", fileSystemTree.ToString()); 
     Console.ReadLine(); 
    } 
    static JObject joNew = new JObject(); 
    static JObject CreateFileSystemJsonTree(string source) 
    { 
     // 
     // Build a list of all the IPs 
     // 
     //Console.WriteLine(source); 
     using (var poiDbContext = new poiDbEntities()) 
     { 
      DirectoryInfo di = new DirectoryInfo(source); 
       { 
        joNew = new JObject(
         new JProperty(di.Name, new JArray(Directory.GetDirectories(source).Select(d => CreateFileSystemJsonTree(d)))), 
         new JProperty("files", new JArray(di.GetFiles().Select(fi => new JObject(new JProperty(fi.Name, GetText(fi.Name))))))); 
       } 
       Console.WriteLine(joNew); 
     } 
     return joNew; 
    } 
    public static string GetText(string fiName) 
    { 
     using (var poiDbContext = new poiDbEntities()) 
     { 
      string indexNameBody = fiName.Substring(0, fiName.LastIndexOf('.')); 
      var indexResult = "test"; // dummied up for use by evaluators 
      return indexResult.Trim(); 
     } 
    } 

Я пытаюсь создать из дерева файлов системного каталога с помощью рекурсии. Я работаю с XML, но предпочитаю дерево JSON. Проблема заключается в том, что появляются файлы txt, а не с родительским [], который представляет собой самую низкую папку, но вместо этого добавляется как JsonProperties с текстовым именем, которое я добавил как «файлы» (чего я не хочу). Кроме того, «файлы» генерируются, даже если нет файлов, например, в пустой папке. Сгенерированный системой фрагмент сопровождается возможным желаемым фрагментом.

"Sports": [ 
     { 
      "NBA": [], 
      "files": [] // Undesirable--The folder is empty`` 
     },`` 

Два сниппеты:

{ 
     "Politics": [ 
     { 
      "PresCandidates": [ 
      { 
       "Republican": [], // Notice the files are not in array within the [] of the Republican  
       "files": [  
       { 
        "carson_ben_s.txt": "Ben Carson" 
       }, 
       { 
        "trump_donald_j.txt": "Donald Trump" 
       }, 
       { 
        "walker_scott_k.txt": "Scott Walker" 
       } 
       ] 
      } 
      ] 
     } 
     ], 
     "Politics": [ // The desired format 
     { 
      "PresCandidates": [ 
      { 
       "Republican": [ 
           { 
            "carson_ben_s.txt": "Ben Carson" 
           }, 
           { 
            "trump_donald_j.txt": "Donald Trump" 
           }, 
           { 
            "walker_scott_k.txt": "Scott Walker" 
           } 
          ], 

{

ответ

0

Я не уверен, я понимаю, JSON, который вы хотите создать. Если вы ищете набор вложенных объектов JSON, где каждое имя свойства соответствует имени файла или каталога, а для файла значение свойства задается с помощью некоторого метода обратного вызова, тогда как для подкаталога это рекурсивно объект содержащих объекты для всего содержимого поддиректории, вы можете сделать это:

public static class DirectoryInfoExtensions 
{ 
    public static JObject ToJson<TResult>(this DirectoryInfo info, Func<FileInfo, TResult> getData) 
    { 
     return new JObject 
      (
      info.GetFiles().Select(f => new JProperty(f.Name, getData(f))).Concat(info.GetDirectories().Select(d => new JProperty(d.Name, d.ToJson(getData)))) 
      ); 
    } 
} 

И затем использовать его как:

 string path = @"C:\Program Files (x86)\Microsoft Visual Studio 9.0"; 

     var di = new DirectoryInfo(path); 
     Debug.WriteLine(di.ToJson(f => f.LastWriteTimeUtc)); 

Который производит вывод, как:

{ 
    "redist.txt": "2007-10-16T21:56:34Z", 
    "Common7": { 
    "IDE": { 
     "Brief.vsk": "2007-06-20T21:55:14Z", 
     "WinFxCustomControlTemplateWizard.dll": "2008-07-30T14:06:58Z", 
     "1033": { 
     "cmddefui.dll": "2008-07-30T14:06:58Z", 
     "Microsoft.VisualStudio.DesignUI.dll": "2008-07-30T14:06:58Z", 
     "Microsoft.VisualStudio.EditorsUI.dll": "2008-07-30T14:06:58Z", 

    Many values removed, 

     "VsWizUI.dll": "2008-07-30T14:06:58Z", 
     "WindowsFormsIntegration.PackageUI.dll": "2008-07-30T14:06:58Z" 
     }, 
     "en": { 
     "Microsoft.VisualStudio.Package.LanguageService.xml": "2007-03-02T04:30:40Z", 
     "Microsoft.VisualStudio.Shell.Design.xml": "2007-03-06T04:40:44Z", 
     "Microsoft.VisualStudio.Shell.xml": "2007-03-06T04:40:44Z" 
     }, 
     "ExceptionAssistantContent": { 
     "1033": { 
      "DefaultContent.xml": "2007-09-03T05:11:44Z" 
     } 
     } 
    } 
    } 
} 

Это то, что вы хотите? У вашей частичной выборки JSON есть массивы, но я не вижу, где и как они вам нужны.

Если это не то, что вы хотите, не могли бы вы немного разъяснить желаемый формат JSON?

Кстати, если у вас работает XML, вы всегда можете использовать JsonConvert.SerializeXNode().

0

Идея работала красиво. Спасибо. У меня есть один комментарий и еще один вопрос. Я понимаю, что нет стандартного формата для дерева json-файлов. Однако не имеет смысла, что каждая папка должна быть запущена и закончена с помощью [], потому что они не «листовые» узлы? Я попытался изменить ваш код, чтобы он выглядел следующим образом, но безуспешно. Я добавил отметку времени.

{ "7/28/2015 6:00:45 PM": // Modified by hand lennane_ava_l.txt": "Ava Lennane", "ALists": [ // Modified by hand "clinton_hillary_r.txt": "Hillary Clinton", "depasquale_vincent_99.txt": "Vincent Depasquale", "trump_donald_j.txt": "Donald Trump", "zz_kilroy_99.txt": "Kilroy", "Criminals": [], // Modified by hand "Entertainment": [], // Modified by hand "Politics": [ // Modified by hand "clinton_hillary_r.txt": "Hillary Clinton", "lennane_james_p.txt": "Jim Lennane", "trump_donald_j.txt": "Donald Trump", "PresCandidates": { // Unmodified "clinton_hillary_r.txt": "Hillary Clinton", "trump_donald_j.txt": "Donald Trump", "Democrat": { // Unmodified "clinton_hillary_r.txt": "Hillary Clinton" }, "Other": {}, "Republican": { "carson_ben_s.txt": "Ben Carson", "lennane_james_p.txt": "Jim Lennane", "trump_donald_j.txt": "Donald Trump", "walker_scott_k.txt": "Scott Walker"

+0

Был ли это ответом на меня? Если это так, вероятно, должен был быть [комментарий] (http://meta.stackexchange.com/questions/19756/how-do-comments-work) - возможно, по вашему собственному вопросу с вставленным «@dbc». – dbc

+0

JSON, который вы предлагаете, недействителен в соответствии со стандартом [http://json.org/). JSON имеет две конструкции контейнера: массивы, которые выглядят как '[value1, value2, ..., valueN]' и объекты, которые выглядят как '{" name1 ": value1," name2 ": value2, ...," nameN ": valueN} '. Ваш JSON имеет квадратные скобки, ограничивающие набор пар имя/значение, что недопустимо. – dbc

+0

Спасибо за ввод. Я использую решение, которое вы предоставили. Что касается неправильного использования «комментариев», я постараюсь быть более информированным. – user3594395