2016-11-10 7 views
0

У меня массивный json-файл, который очень вложен. Мне нужно написать несколько файлов csv в зависимости от имени определенного поля, если оно существует, тогда добавьте значения в созданные заголовки, если они не создадут новый. Это работает отлично. Однако я столкнулся с проблемой, когда заголовки не совпадают, потому что этот конкретный заголовок не существует для этой записи. Пример:Создание csv-файла из json с разными значениями заголовка за запись

Header: Dog Cat Mouse Horse 
Record1: yes yes yes yes 

// Выше приведен пример файла со всеми значениями Добавление записи двух, где значение заголовка не перечислены на всех

Header: Dog Cat Mouse Horse 
Record1: yes yes yes yes 
Record2: yes yes yes *** 

Record2 выше, не имеют мыши на но из-за того, что он не выстраивает линию сдвига влево. Мне нужно написать Null под заголовком, прежде чем выплескивать значения в файл. Ниже мой код, если вы могли бы помочь, что было бы здорово, как я потерял в этот момент:

 static List<string> headList = new List<string>(); 
     static List<string> newHeaderList = new List<string>(); 
     static List<string> valueList = new List<string>(); 
     static List<string> oldHeadList = new List<string>(); 
     static void Main() 
     { 
      var data = JsonConvert.DeserializeObject<dynamic>(File.ReadAllText(
          @"C:\Users\nphillips\workspace\2016R23\UITestAutomation\SeedDataGenerator\src\staticresources\seeddata.resource")); 
      string fileName = ""; 
      var bundles = data.RecordSetBundles; 

      foreach (var bundle in bundles) 
      { 
       var records = bundle.Records; 
       foreach (var record in records) 
       { 
        var test = record.attributes; 
        foreach (var testagain in test) 
        { 
         // Getting the object Name Ex. Location, Item, etc. 
         var jprop = testagain as JProperty; 
         if (jprop != null) 
         { 
          fileName = jprop.First.ToString().Split('_')[2] + ".csv"; 
         } 
         break; 
        } 
        string header = ""; 
        string value = ""; 
        foreach (var child in record) 
        { 
         var theChild = child as JProperty; 
         if (theChild != null && !theChild.Name.Equals("attributes")) 
         { 
          // adding the name and values to list 
          headList.Add(child.Name); 
          valueList.Add(child.Value.ToString()); 
         } 
        } 
        // calling method to write columns and values 
        writeCSV(headList, valueList, fileName); 
        valueList.Clear(); 
        headList.Clear(); 
       } 
      } 
     } 

     public static void writeCSV(List<string> headList, List<string> valList, string fileName) 
     { 
      string headerString = ""; 
      string value = ""; 

      if (!File.Exists(fileName)) 
      { 
       foreach (var header in headList) 
       { 
        foreach (var val in valList) 
        { 
         value += val + ","; 
        } 
        oldHeadList.Add(header); 
        headerString += header + ','; 
       } 

       headerString += "+" + Environment.NewLine; 
       File.WriteAllText(fileName, headerString); 
      } 
      else 
      { 
       foreach (var header in headList) 
       { 
        foreach (var oldHeader in oldHeadList) 
        { 
         foreach (var val in valList) 
         { 
          if (header != oldHeader) 
          { 
           value += "null,"; 
          } 
          else 
          { 
           value += val + ","; 
          } 
         } 

        } 
       } 
      } 
      File.AppendAllText(fileName, value); 
      value += Environment.NewLine; 
     } 
    } 

Мой ужасающий JSON-файл, который я не могу изменить, как его использовали на моей компании: https://codeshare.io/rGL6K5

ответ

0

Есть ли какой-то образец? Причина, о которой я прошу, может быть, вы можете создать службу, которая сериализует JSON для сложных объектов. Как только это будет сделано, у вас будет служба, которая сериализует этот объект в csv. Служба будет знать, что нужно писать несколько файлов csv по мере необходимости.

0

Я бы держался подальше от использования {dynamic}, если есть надежный шаблон для JSON. Я бы получил образец JSON-файла, скопировал его в буфер обмена и использовал функцию Paste JSON to Classes в Visual Studio.

https://blogs.msdn.microsoft.com/webdev/2012/12/18/paste-json-as-classes-in-asp-net-and-web-tools-2012-2-rc/

После этого, десериализации его Newtonsoft.JSON в хороший надежный объект, из которого построить свой CSV.