2015-12-11 2 views
0

Начну с того, что я знаю, как использовать библиотеку javascript JSON, мой вопрос не так прост, так что, пожалуйста, прочитайте деталь не просто название, так как я не смог выразить это хорошо в названии ...Как создать динамический документ json из массива строк в javascript

То, что я пытаюсь достичь, - это преобразование csv в документ JSON, но с использованием динамической схемы для сопоставления переменных схем csv's определенная схема документа

У меня есть документ JSON, который имеет строковые ключи i, e "Field1", "Field2" и т. д. Соответствующее значение представляет собой строку с разделителями по каналам, которая содержит тип документа перед первый разделитель и ан каждая строка в разделителях выстраивается «Path» динамического JSon документа Я хочу создать ...

Так CSV приходит и преобразуется в формат JSON ....

«Field1» в загруженный CSV содержит значение «Картофель»

Мы извлечение трубы строки с разделителями для «Field1», который имеет значение «1 | Овощи | RootVeg»

поэтому динамически мне нужно создать документ JSon таким образом, чтобы для этого поля соответствующий раздел документа будет выглядеть так:

{ "Vegetables" : { "RootVeg" : "Potatoes"} } 

Надеется, что имеет смысл .... Ниже различный Foreach петля Я пытаюсь построить это с ....

   var vesselprimary = []; 
       var vesselsecondary = []; 
       angular.forEach(value, function (value2, key2) { 
        var pipedValue = data[0][key2]; 
        console.log("pipedvalue", pipedValue); 
        console.log("value2", value2); 
        var arrayValues = pipedValue.split("|"); 
        if (arrayValues[0] === 1) { 
         //Create the VesselPrimary JSON object to put into the body of the post 

         if (arrayValues.count > 2) { 
          vesselprimary[arrayValues[1]] = {}; 
          vesselprimary[arrayValues[1]][arrayValues[2]] = value2; 
         } else { 
          vesselprimary[arrayValues[1]] = value2; 

         } 
        } else { 
         //Create the VesselSecondary JSON object to put into the body of the post 
         if (arrayValues.count > 2) { 
          vesselsecondary[arrayValues[1]] = {}; 
          vesselsecondary[arrayValues[1]][arrayValues[2]] = value2; 
         } else { 
          vesselsecondary[arrayValues[1]] = value2; 

         } 
        } 

       }); 
       //console.log(vesselprimary); 
       this.push(vesselprimary); 
      }, jsonArr); 

Но мой выход менее чем впечатляет ....

"[[],[],[],[],[],[],[],[],[]]" 
+0

Опасность здесь в том, что так много ошибок при чтении CSV. Ваш последний код, скорее всего, будет работать для большинства сценариев, но как насчет CSV с этим ... «val1», «val2, val2b», «val3» - если возможно, используйте JavaScript CSV-ридер вместо этого вручную - если вы используете NodeJS ... https://www.npmjs.com/package/csv ... если нет, тогда ищите JS lib там, который работает для вас - возможно, это не тот ответ, который вы хотите, но вы должны бросить вызов своему подход – danday74

+0

Привет @danday Спасибо за ваш комментарий, и это абсолютно действительный момент, однако эта часть на самом деле не касается импорта csv, что я, вероятно, сделаю с какой-то библиотекой, это чтение конфигурации (чтение схемы) json file что говорит системе, как перевести вывод библиотеки csv в мой формат JDON DocumentDB ..., это имеет смысл? – dreadeddev

ответ

0

в конце концов оказалось, что лучший способ сделать это было на самом деле построить его в виде строки, а затем использовать 3 участника, чтобы преобразовать его в формат JSON ... не уверен, что это лучшая практика способ сделать это, но он кажется относительно эффективным ... очевидно, мне было бы интересно услышать альтернативный подход, поскольку наращивание строк всегда кажется последним для меня!

var csvObj = JSON.parse(json); 
angular.forEach(csvObj, function(value, key2) { 

var actualJsonPrimary = {}; 
var actualJsonSecondary = {}; 
var jsonStrPrim = "{"; 
var jsonStrSec = "{"; 
angular.forEach(value, function(value2, key2) { 
     var pipedValue = data.data[0][key2]; 
     var arrayValues = pipedValue.split("|"); 
     if (arrayValues[0] === "") return; 
     if (arrayValues[0] === "1") { 
     if (arrayValues.length > 2) { 
      jsonStrPrim += " '" 
      + arrayValues[1].toString() + "' : { '" 
      + arrayValues[2].toString() + "' : " 
      + "'" + value2 + "'" + " },"; 
       } else { 
       jsonStrPrim += " '" 
       + arrayValues[1].toString() + "' : " 
       + "'" + value2 + "'" 
       + " ,"; 
      } 
     } else { 
      if (arrayValues.length > 2) { 
       jsonStrSec += " '" 
       + arrayValues[1].toString() + "' : { '" 
       + arrayValues[2].toString() + "' : " 
       + "'" + value2 + "'" 
       + " },"; 
      } else { 
       jsonStrSec += " '" 
       + arrayValues[1].toString() + "' : " 
       + "'" + value2 + "'" 
       + " ,"; 
       } 
      } 
     }); 
     jsonStrPrim += "}"; 
     jsonStrSec += "}"; 
     actualJsonPrimary = eval("(" + jsonStrPrim + ")"); 
     actualJsonSecondary = eval("(" + jsonStrSec + ")"); 
     $http.post('http://myurl/api/sausages', 
     JSON.stringify(actualJsonPrimary), 
     { 
       headers: { 
       'Content-Type': 'application/json' 
       } 
     } 
     ).then(function(data) { 
      deferredObject.resolve(data.data); 

     }, 
      function(err) { 
       console.log("Error posting to API", err); 
     }); 
     }); 

Извините за изворотливый формат, но, надеюсь, это может дать кому-то представление о том, как это сделать лучше!

 Смежные вопросы

  • Нет связанных вопросов^_^