0

次のコードを使用します。

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`` 
        },``

2 つのスニペット:

{  
      "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"  
                                }  
                            ],  

{

4

2 に答える 2

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().

于 2015-07-26T23:53:31.040 に答える
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"

于 2015-07-28T18:26:21.500 に答える